-
При попытке создать новую форму (application.CreateForm(TForm6, Form6); программа подвисает секунд на пять. На форме находится 8 DBLookupComboBox'ов, DBGrid, 9 SimpleDataSet'ов. Используется MySQL 5.1.54 с дефолтными настройками, Delphi XE2. БД очень маленькая, порядка 20 записей в каждой таблице, сервер расположен на той же машине. Используются компоненты SQLConnection и другие все от DBExpress. Прошу помощи :(
-
закрой коннект в дизайне, открывай коннект/таблицы после создания формы... будет быстрым.
-
Сделал что бы SQLConnection подключался после создания формы, ничего не поменялось. Создание формы происходит крайне долго, после этого моментально проходит подключение. SQLConnection закрывал перед создание формы.
-
Создание формы происходит крайне быстро. Всегда. А то что ты видишь - это не то про что ты подумал.
-
Оно само переподключается при создании формы, по крайне мере вызывает событие 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 миллисекунд ВСЁ, дальше появляется форма.
-
Такие вещи например выполняются молниеносно 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;
-
То, что она появляется через Х секунд, вовсе не занчит, что она создавалась все эти Х секунд.
-
Просто спустя Х секунд после создания у формы наконец появляется время на обработку своей собственной отрисовки.
-
Мне кажется во всём виноваты множественные SimpleDataSet'ы с DBLookupComboBox'ами, но там в них запросы в базу мизерные, я просто не понимаю почему так тормозит :(
-
Виноваты синхронные методы, вызванные после создания формы. Которые пока не закончились, не дают форме отрисовать себя.
-
Как это можно пофиксить?
-
как как. разорвать цепочку синхронных методов естественно.
-
Ничего не понял.
-
>Виноваты синхронные методы, вызванные после создания формы. Которые пока не закончились, не дают форме отрисовать себя.
-
> запросы в базу мизерные, я просто не понимаю почему так тормозит :( любое действие вставленное в другое, и зависящее от третьего... тормозит не на столько сколько оно выполняется, а на столько сколько его пришлось ждать, прежде чем выполнить, плюс столько сколько "ждется" третье от которого зависит... и только после + сколько выполняется само.
... не парься, прими что все несколько сложнее чем тебе кажется, и просто делай правильно. создание отдельно, котлеты... т.е. все остальное отдельно. сделай как сказал, закрыть конект в дизайне, и закоментарь все открытия. т.е. чтобы после создания видеть пустые/не активные db контролы... быстро? т.е. > множественные SimpleDataSet'ы с DBLookupComboBox'ами ни при чем.
> SQLConnection закрывал перед создание формы. не закрывать перед, а чтоб было закрыто перед компиляцией/выполнением, вообще и всегда. не держи открытых таблиц/коннектов в дизайне.
> Ничего не понял. а ты пробуй "не понятое", буквально, может поймешь в процессе. а модифицируя под свое понимание... не понимание, только сам себя путаешь.
-
> закрыть конект в дизайне, и закоментарь все открытия. т. > е. чтобы после создания видеть пустые/не активные db контролы. > .. быстро?
Вынес все подключения из дизайна в рантайм - тормозит так же. Закомментил вот этого монстра И всё стало открываться моментально :( Как же их побороть? Может какое то секретное своство "не тормозить" у них есть? > а ты пробуй "не понятое", буквально, может поймешь в процессе. > а модифицируя под свое понимание...
Я просто вообще не понял что за синхронные методы и в каком направлении копать, гугл не дал никакой полезной информации.
-
> Alez © (25.12.11 22:55) [10] > > Как это можно пофиксить?
Если что-то должно быть выполнено при старте программы, но это что-то не может быть выполнено быстро - то 1. Вариантов много; 2. Вариантов нет. Выбирай любое.
P.S. Но лично я бы, в первую очередь обратил бы внимание на > sniknik © (25.12.11 20:56) [1] > > закрой коннект в дизайне, открывай коннект/таблицы после > создания формы... будет быстрым. >
-
> Может какое то секретное своство "не тормозить" у них есть? мозг и логика... открывай только то что нужно, только тогда когда нужно, и как можно быстрым/подходящим способом. не все сразу скопом. ну или превью на старте давай с типа "загрузка данных". > не понял что за синхронные методы и в каком направлении копать тебе нужны не синхронные, а асинхронные. про синхронные было сказано в объяснении почему у тебя так как есть 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 способ закачки данных параллельно тому чего делаешь.
-
Попробовал сделать через связку SQLQuery + DataSetProvider + ClientDataSet, надеялся так быстрее Вот эта вещь SQLQuery1.Open;
ClientDataSet1.Open; выполняется пол секунды, при том что база имеет 31 запись. :( В итоге, значит это нормально, для Делфи, что он так подвисает?
-
> В итоге, значит это нормально, для Делфи, что он так подвисает? в итоге, это нормально для тебя и твоей программы, раз по другому не можешь. а вообще за пол секунды можно до китайской границы добежать... т.е. раз в 1000 минимум больше чем 31 запись "вкачать".
ну вот к примеру проверил SELECT TOP 31000 * FROM Wares 0,266 сек вот так SELECT TOP 31000 * FROM Wares 1,265 сек а вся таблица 171832 записей 2,078 сек 31 запись даже не считает в секундах 0 равно, нужно расчет на "тики" переводить.
и это простой синхронный запрос, асинхронный открылся бы быстрее (не зависимо от количества записей в таблице)... но завершился бы позже... и уже с зависимостью, чем больше тем позже.
|