Конференция "Базы" » Очень долго создаётся новая форма. [MySQL]
 
  • Alez © (25.12.11 20:16) [0]
    При попытке создать новую форму
    (application.CreateForm(TForm6, Form6);


    программа подвисает секунд на пять.
    На форме находится 8 DBLookupComboBox'ов, DBGrid, 9 SimpleDataSet'ов.
    Используется MySQL 5.1.54 с дефолтными настройками, Delphi XE2.
    БД очень маленькая, порядка 20 записей в каждой таблице, сервер расположен на той же машине.
    Используются компоненты SQLConnection и другие все от DBExpress.
    Прошу помощи :(
  • sniknik © (25.12.11 20:56) [1]
    закрой коннект в дизайне, открывай коннект/таблицы после создания формы... будет быстрым.
  • Alez © (25.12.11 22:02) [2]
    Сделал что бы SQLConnection подключался после создания формы, ничего не поменялось. Создание формы происходит крайне долго, после этого моментально проходит подключение. SQLConnection закрывал перед создание формы.
  • Медвежонок Пятачок © (25.12.11 22:19) [3]
    Создание формы происходит крайне быстро. Всегда.
    А то что ты видишь - это не то про что ты подумал.
  • Alez © (25.12.11 22:37) [4]
    Оно само переподключается при создании формы, по крайне мере вызывает событие AfterConnect.
    Если рассматривать пошагово создание формы, то это выглядит так
    - доходит до создания формы
    - выполняет создание практически моментально
    - заходит в процедуру вычисляемых полей SimpleDataSet1CalcFields
    - доходит проходит END; дальше виснет на 5 секунд, отладчик в этот момент показывает
    Thread Start: Thread ID: 6124. Process Project1.exe (3500)


    - выполняет Form6.Showmodal;
    - дальше выполняется ONSHOW шестой формы.
    - в ONSHOW выполняется запрос (например такой
    SELECT `postanovlenie`,`vedomstvo`, `organ`, `type`, `FIO`,  `data_registracii` FROM `expertise` WHERE (`data_registracii` > 1324771200);

    )
    - при его выполнении
    SimpleDataset1.Active:=true;

    подвисает на секунду
    -
    SimpleDataset1.DataSet.Active:=true;

    подвисает на 500 миллисекунд

    ВСЁ, дальше появляется форма.
  • Alez © (25.12.11 22:41) [5]
    Такие вещи например выполняются молниеносно
       SQLQuery:=TSQLQuery.Create(nil);
       SQLQuery.SQLConnection:=Form1.SQLConnection1;
       SQLQuery.SQL.Text:=('SELECT MAX(`id_exp`) FROM expertise`;');
       SQLQuery.Open;
       tempnum:=SQLQuery.Fields[0].AsInteger+1;
       SQLQuery.Destroy;

  • Медвежонок Пятачок © (25.12.11 22:42) [6]
    То, что она появляется через Х секунд, вовсе не занчит, что она создавалась все эти Х секунд.
  • Медвежонок Пятачок © (25.12.11 22:44) [7]
    Просто спустя Х секунд после создания у формы наконец появляется время на обработку своей собственной отрисовки.
  • Alez © (25.12.11 22:49) [8]
    Мне кажется во всём виноваты множественные SimpleDataSet'ы с DBLookupComboBox'ами, но там в них запросы в базу мизерные, я просто не понимаю почему так тормозит :(
  • Медвежонок Пятачок © (25.12.11 22:50) [9]
    Виноваты синхронные методы, вызванные после создания формы. Которые пока не закончились, не дают форме отрисовать себя.
  • Alez © (25.12.11 22:55) [10]
    Как это можно пофиксить?
  • Медвежонок Пятачок © (25.12.11 22:56) [11]
    как как.
    разорвать цепочку синхронных методов естественно.
  • Alez © (25.12.11 23:12) [12]
    Ничего не понял.
  • Медвежонок Пятачок © (25.12.11 23:29) [13]
    >Виноваты синхронные методы, вызванные после создания формы. Которые пока не закончились, не дают форме отрисовать себя.
  • sniknik © (25.12.11 23:58) [14]
    > запросы в базу мизерные, я просто не понимаю почему так тормозит :(
    любое действие вставленное в другое, и зависящее от третьего... тормозит не на столько сколько оно выполняется, а на столько сколько его пришлось ждать, прежде чем выполнить, плюс столько сколько "ждется" третье от которого зависит... и только после + сколько выполняется само.

    ... не парься, прими что все несколько сложнее чем тебе кажется, и просто делай правильно. создание отдельно, котлеты... т.е. все остальное отдельно.
    сделай как сказал, закрыть конект в дизайне, и закоментарь все открытия. т.е. чтобы после создания видеть пустые/не активные db контролы... быстро?
    т.е.
    > множественные SimpleDataSet'ы с DBLookupComboBox'ами
    ни при чем.

    > SQLConnection закрывал перед создание формы.
    не закрывать перед, а чтоб было закрыто перед компиляцией/выполнением, вообще и всегда. не держи открытых таблиц/коннектов в дизайне.

    > Ничего не понял.
    а ты пробуй "не понятое", буквально, может поймешь в процессе. а модифицируя под свое понимание... не понимание, только сам себя путаешь.
  • Alez © (26.12.11 02:30) [15]

    > закрыть конект в дизайне, и закоментарь все открытия. т.
    > е. чтобы после создания видеть пустые/не активные db контролы.
    > .. быстро?

    Вынес все подключения из дизайна в рантайм - тормозит так же.
    Закомментил вот этого монстра
     {SimpleDataSet1.Open;
     SimpleDataSet1.DataSet.Open;
     SimpleDataSet2.Open;
     SimpleDataSet2.DataSet.Open;
     SimpleDataSet3.Open;
     SimpleDataSet3.DataSet.Open;
     SimpleDataSet4.Open;
     SimpleDataSet4.DataSet.Open;
     SimpleDataSet5.Open;
     SimpleDataSet5.DataSet.Open;
     SimpleDataSetFIOLF.Open;
     SimpleDataSetFIOLF.DataSet.Open;
     SimpleDataSetOrganLF.Open;
     SimpleDataSetOrganLF.DataSet.Open;
     SimpleDataSetProductionLF.Open;
     SimpleDataSetProductionLF.DataSet.Open;
     SimpleDataSetVedomstvoLF.Open;
     SimpleDataSetVedomstvoLF.DataSet.Open;}


    И всё стало открываться моментально :(
    Как же их побороть? Может какое то секретное своство "не тормозить" у них есть?

    > а ты пробуй "не понятое", буквально, может поймешь в процессе.
    >  а модифицируя под свое понимание...

    Я просто вообще не понял что за синхронные методы и в каком направлении копать, гугл не дал никакой полезной информации.
  • Германн © (26.12.11 02:33) [16]

    > Alez ©   (25.12.11 22:55) [10]
    >
    > Как это можно пофиксить?

    Если что-то должно быть выполнено при старте программы, но это что-то не может быть выполнено быстро - то
     1. Вариантов много;
     2. Вариантов нет.
    Выбирай любое.

    P.S. Но лично я бы, в первую очередь обратил бы внимание на
    > sniknik ©   (25.12.11 20:56) [1]
    >
    > закрой коннект в дизайне, открывай коннект/таблицы после
    > создания формы... будет быстрым.
    >
  • sniknik © (26.12.11 07:56) [17]
    > Может какое то секретное своство "не тормозить" у них есть?
    мозг и логика...
    открывай только то что нужно, только тогда когда нужно, и как можно быстрым/подходящим способом. не все сразу скопом. ну или превью на старте давай с типа "загрузка данных".

    > не понял что за синхронные методы и в каком направлении копать
    тебе нужны не синхронные, а асинхронные. про синхронные было сказано в объяснении почему у тебя так как есть
    http://www.google.ru/search?hl=ru&newwindow=1&client=firefox&hs=2KN&rls=org.mozilla:ru:official&sa=X& ei=Ze_3Tv7WF8X2sgblv5z-Dw&ved=0CCEQBSgA&q=delphi+%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B&spell=1&biw=1272&bih=849
    способ закачки данных параллельно тому чего делаешь.
  • Alez © (26.12.11 19:35) [18]
    Попробовал сделать через связку SQLQuery + DataSetProvider + ClientDataSet, надеялся так быстрее
    Вот эта вещь
     SQLQuery1.Open;
     ClientDataSet1.Open;

    выполняется пол секунды, при том что база имеет 31 запись. :(

    В итоге, значит это нормально, для Делфи, что он так подвисает?
  • sniknik © (26.12.11 19:59) [19]
    > В итоге, значит это нормально, для Делфи, что он так подвисает?
    в итоге, это нормально для тебя и твоей программы, раз по другому не можешь.
    а вообще за пол секунды можно до китайской границы добежать... т.е. раз в 1000 минимум больше чем 31 запись "вкачать".

    ну вот к примеру проверил
    SELECT TOP 31000 * FROM Wares
    0,266 сек
    вот так
    SELECT TOP 31000 * FROM Wares
    1,265 сек
    а вся таблица
    171832 записей 2,078 сек
    31 запись даже не считает в секундах 0 равно, нужно расчет на "тики" переводить.

    и это простой синхронный запрос, асинхронный открылся бы быстрее (не зависимо от количества записей в таблице)... но завершился бы позже... и уже с зависимостью, чем больше тем позже.
  • sniknik © (26.12.11 20:35) [20]
    > Попробовал сделать через связку SQLQuery + DataSetProvider + ClientDataSet, надеялся так быстрее
    как то давно уже делал пример...
    http://webfile.ru/5745697
    на подобную связку.

    запустить хотя бы раз сервер, после можно клиент, выбираешь базу (mdb) и открываешь таблицу, выбери побольше размером, чтобы самому засечь можно было, таймера в примере нет.
  • Alez © (26.12.11 22:01) [21]

    > раз по другому не можешь.

    Ну я просто не понимаю как по другому. Тут на форме банально Simpledataset, в нём запрос, например такой
    SELECT `postanovlenie`,`vedomstvo`, `organ`, `type`, `FIO`,  `data_registracii` FROM `expertise` WHERE (`data_registracii` > 1322265600);

    возвращает всего 4 записи, выполняет примерно ну 400мс, по 200 мс на
    Simpledataset.open

    и на
    Simpledataset.dataset.open;

    . Через Navicat такой же запрос выполняется за 0.001s как он сам сообщает.
  • sniknik © (26.12.11 22:06) [22]
    > Ну я просто не понимаю как по другому.
    справку почитай, там обычно самый правильный способ описывают...

    > Тут на форме банально Simpledataset, в нём запрос, например такой
    > Simpledataset.open
    > Simpledataset.dataset.open;
    че за ребусы? запрос один, опенов два... нафига?
  • Alez © (26.12.11 22:07) [23]
    Вот пошёл поспал, сейчас вернулся скомпилил и о чудо, всё просто летает!!!
    Но после того как по ходу программы Simpledataset'ы ПЕРЕОТКРЫВАЮТСЯ, то есть open close методы, оно опять начинает работать с жуткими задержками.
    В моём делфи полтергейст :)...
  • Alez © (26.12.11 22:10) [24]

    > че за ребусы? запрос один, опенов два... нафига?

    Ну это один что бы можно было просмотреть инфу, а второй что бы инфа буферизировалась и её можно было менять я так понимаю...
  • Alez © (26.12.11 22:14) [25]
    До этого делал программы в CodeGear RAD 2007 Delphi, делал всё так же и не знал что такие проблемы могу существовать. А тут поставил новейший XE2 думал посмотреть что нового появилось и напоролся вот со своей любознательностью :(
  • Alez © (27.12.11 02:21) [26]
    В итоге везде удалил
    Simpledataset.dataset.open;

    и оставил только
    Simpledataset.open

    , тормоза вроде тфу тфу пропали! :)
    Всем большое спасибо! :)
  • Ega23 © (27.12.11 12:18) [27]

    >  а второй что бы инфа буферизировалась и её можно было менять
    > я так понимаю...


    Меня вот вчера мой сосед-PHPшник  уверял, что в С++ в объектах нет деструкторов. Вот нету и всё. Потому что он так это понимает. А ещё, что "первая нормальная форма" в РСУБД - это "один-ко-многим". Вот так вот он это понимает.

    Предложил мне забиться с ним на 10.000 рублей. Я моментом не стал пользоваться, ограничился выигранным пивом.

    Собственно, к чему это: не надо "я так понимать", надо читать справку, там всё очень чётко расписано.
  • Alez © (27.12.11 16:34) [28]
    То есть это свойство ему не нужно? Везде достаточно
    Simpledataset.open

    ?

    > Собственно, к чему это: не надо "я так понимать", надо читать
    > справку, там всё очень чётко расписано.

    Там тяжёлым для понимания языком описано, да еще и на английском :(
  • Ega23 © (27.12.11 17:07) [29]

    > Там тяжёлым для понимания языком описано, да еще и на английском
    > :(


    Документация практически вся на английском написана.
    Так что либо учи английский, либо меняй профессию, пока не поздно.
 
Конференция "Базы" » Очень долго создаётся новая форма. [MySQL]
Есть новые Нет новых   [134431   +11][b:0][p:0.003]