Страница 1 из 1
Выполнение запроса в Delphi
Добавлено: 08 дек 2005, 00:27
Viktor Zull
У меня есть довольно сложный запрос в котором проверяются несколько условий. Запрос выполняется в течение 1 минуты, и в это время приложение кажется зависшим. Хочу оптимизировать этот процесс с помощью Application.ProgressMessager, вот только не знаю в какое событие для ADOQuery его поставить.
Добавлено: 08 дек 2005, 10:59
Naeel Maqsudov
Ничего не получится. В процессе выполнения запроса ADOQuery (и не только ADOQuery) не вызывает никаких своих событий. TCustomDataset и все его потомки в момент открытия (а также в процессе навигации) вызывают синхронно (т.е. с ожиданием возврата) внутренние методы для получения данных. Эти внутренние методы в зависимости от реализации обращаются в OLEDB, ODBC и др. ADO-провайдерам или драйверам BDE.
Другими словами, то что делает ADO-провайдер для TADOQuery - это черный ящик, в который ADOQuery не заглядывает, а только отдает туда запрос и стоит и ждет пока вернут результат.
Выходы:
1) ТРАДИЦИОННЫЙ: Использовать потоки (TThread) и Open вызывать в отдельном потоке.
2) ФУНДАМЕНТАЛЬНЫЙ: Переписать класс-родитель TADOQuery (по-моему это TCustomQuery), включив туда поддержку многопоточности и, добавив соответствующие события, вызываемые при завершении обработки запроса, а также в процессе обработки. После чего взять исходники TADOQuery и создать свой компонент путем замены родителя TADOQuery.
Добавлено: 08 дек 2005, 11:34
Игорь Акопян
причём если покопаться в сети можно прочитать много нецензурной брани про стандартные АДО компоненты - жуть тормозные... Если позволяют средства - можно поискать готовые решения типа GMComponents - они вроде лидерами считаются (сам не юзал)