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