Выполнение запроса в Delphi

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

У меня есть довольно сложный запрос в котором проверяются несколько условий. Запрос выполняется в течение 1 минуты, и в это время приложение кажется зависшим. Хочу оптимизировать этот процесс с помощью Application.ProgressMessager, вот только не знаю в какое событие для ADOQuery его поставить.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Ничего не получится. В процессе выполнения запроса ADOQuery (и не только ADOQuery) не вызывает никаких своих событий. TCustomDataset и все его потомки в момент открытия (а также в процессе навигации) вызывают синхронно (т.е. с ожиданием возврата) внутренние методы для получения данных. Эти внутренние методы в зависимости от реализации обращаются в OLEDB, ODBC и др. ADO-провайдерам или драйверам BDE.
Другими словами, то что делает ADO-провайдер для TADOQuery - это черный ящик, в который ADOQuery не заглядывает, а только отдает туда запрос и стоит и ждет пока вернут результат.

Выходы:
1) ТРАДИЦИОННЫЙ: Использовать потоки (TThread) и Open вызывать в отдельном потоке.
2) ФУНДАМЕНТАЛЬНЫЙ: Переписать класс-родитель TADOQuery (по-моему это TCustomQuery), включив туда поддержку многопоточности и, добавив соответствующие события, вызываемые при завершении обработки запроса, а также в процессе обработки. После чего взять исходники TADOQuery и создать свой компонент путем замены родителя TADOQuery.
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

причём если покопаться в сети можно прочитать много нецензурной брани про стандартные АДО компоненты - жуть тормозные... Если позволяют средства - можно поискать готовые решения типа GMComponents - они вроде лидерами считаются (сам не юзал)
Изображение
Ответить