-
При попытке создать новую форму (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 равно, нужно расчет на "тики" переводить.
и это простой синхронный запрос, асинхронный открылся бы быстрее (не зависимо от количества записей в таблице)... но завершился бы позже... и уже с зависимостью, чем больше тем позже.
-
> Попробовал сделать через связку SQLQuery + DataSetProvider + ClientDataSet, надеялся так быстрее как то давно уже делал пример... http://webfile.ru/5745697на подобную связку. запустить хотя бы раз сервер, после можно клиент, выбираешь базу (mdb) и открываешь таблицу, выбери побольше размером, чтобы самому засечь можно было, таймера в примере нет.
-
> раз по другому не можешь.
Ну я просто не понимаю как по другому. Тут на форме банально 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 как он сам сообщает.
-
> Ну я просто не понимаю как по другому. справку почитай, там обычно самый правильный способ описывают...
> Тут на форме банально Simpledataset, в нём запрос, например такой > Simpledataset.open > Simpledataset.dataset.open; че за ребусы? запрос один, опенов два... нафига?
-
Вот пошёл поспал, сейчас вернулся скомпилил и о чудо, всё просто летает!!! Но после того как по ходу программы Simpledataset'ы ПЕРЕОТКРЫВАЮТСЯ, то есть open close методы, оно опять начинает работать с жуткими задержками. В моём делфи полтергейст :)...
-
> че за ребусы? запрос один, опенов два... нафига?
Ну это один что бы можно было просмотреть инфу, а второй что бы инфа буферизировалась и её можно было менять я так понимаю...
-
До этого делал программы в CodeGear RAD 2007 Delphi, делал всё так же и не знал что такие проблемы могу существовать. А тут поставил новейший XE2 думал посмотреть что нового появилось и напоролся вот со своей любознательностью :(
-
В итоге везде удалил Simpledataset.dataset.open; и оставил только Simpledataset.open , тормоза вроде тфу тфу пропали! :) Всем большое спасибо! :)
-
> а второй что бы инфа буферизировалась и её можно было менять > я так понимаю...
Меня вот вчера мой сосед-PHPшник уверял, что в С++ в объектах нет деструкторов. Вот нету и всё. Потому что он так это понимает. А ещё, что "первая нормальная форма" в РСУБД - это "один-ко-многим". Вот так вот он это понимает.
Предложил мне забиться с ним на 10.000 рублей. Я моментом не стал пользоваться, ограничился выигранным пивом.
Собственно, к чему это: не надо "я так понимать", надо читать справку, там всё очень чётко расписано.
-
То есть это свойство ему не нужно? Везде достаточно Simpledataset.open ? > Собственно, к чему это: не надо "я так понимать", надо читать > справку, там всё очень чётко расписано.
Там тяжёлым для понимания языком описано, да еще и на английском :(
-
> Там тяжёлым для понимания языком описано, да еще и на английском > :(
Документация практически вся на английском написана. Так что либо учи английский, либо меняй профессию, пока не поздно.
|