Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Офигеете: отмена выполнения асинхронных запросов ADOQuery. MSSQL   Найти похожие ветки 

 
Vanoid   (2004-03-17 16:52) [0]

Есть проблема с ADOQuery. Запускаю запрос на выполнение (он может выполняться аж несколько минут). В любой момент времени мне нужно отменить выполение этого запроса и задать новый. Ждать окончания выполнения нельзя (ну- не больше полсекунды)
При этом все это работает в отдельном потоке (Thread), по завершению которого и нужно отменить ADOQuery

Делаю так: запрос открываю с ExecuteOption=[eoAsyncExecute].
На AfterOpen стоит обработчик, который устанавливает флаг открытия.

Кусок выглядит так:

 form3.q[6].open; //открываем
 while (not form3.opened[6]) and (not form3.RunningThreads.TerminateUpdateOpl) do //ждем пока не откроется или пока не выставится флаг принудительного завершения
   begin
     if form3.RunningThreads.TerminateUpdateOpl then//если это флаг принудительного завершения
       begin
         form3.q[6].Close;//закрываем (можно так???)
         repeat until form3.q[6].State=dsInactive;//на всякий пожарный ждем, пока действительно закроется
       end;
   end;
 if form3.RunningThreads.TerminateUpdateOpl then begin form3.RunningThreads.UpdateOpl:=0; form3.label58.visible:=false; exit; end; //если это флаг принудительного завершения... Поставим 0, что не выполняется больше

Так вот: все это работает до того момента как мы решим принудительно закрыть (во время выполнения). Если немедленно поменять SQL у этого ADOQuery- он вылетает с ошибкой. Что интересно- такая же ошибка и в том случае, если сразу после принудительного закрытия- закрыть и приложение. Но что самое интересное- иногда оно срабатывает...

Вроде- ничего сложного... Но никак не могу понять- что к чему...

Если это важно, то одновременно обрабатывается до семи подобных потоков с разными запросами, и закрывать их надо тоже одновременно.

По инету не нашел почти никакой информации ни по Threads, ни по ADOQuery async. Вообщем- вопрос остался невыясненным... :(

ЗЫ Если найдется что ответить: скиньте на мыло (если не напряжет)


 
sniknik ©   (2004-03-17 17:41) [1]

> По инету не нашел почти никакой информации ни по Threads, ни по ADOQuery async
ну это просто нонсенс.

> Запускаю запрос на выполнение (он может выполняться аж несколько минут).
выполнятся или получатся данные? разные вещи в первом eoAsyncExecute бессмысленен.

> ... ADOQuery- он вылетает с ошибкой. ...
попробуй поменять ADOQuery на ADODataSet1 а eoAsyncExecute на eoAsyncFetchNonBlocking
(с ними у меня прерывание работает, а с твоими проверять ломает)

и вопрос, зачем в случае с асинхронным выполнением еще дополнительно пихать в свои потоки, просто для усложнений, или смысл есть?

> ЗЫ Если найдется что ответить: скиньте на мыло (если не напряжет)
не предлагай даже, это все одно что сказать "вопрос-шутка,  просьба не отвечать", и если бы он не был так рассписан... (видно старался)


 
Vanoid   (2004-03-18 09:22) [2]

Помимо самого запроса там еще всякая ерунда творится (которая тоже занимает врмени), но оно легко терминэйтится. Потому и потоки сделаны.


 
Fiend ©   (2004-03-18 09:35) [3]

То Vanoid:
не то чтобы даже попробуй (как сказал sniknik) поменять ADOQuery, а обязательно нужно заменить ADOQuery на ADOCommand. Только он может остановить выполнение запроса. Кстати запихивать всё это в отдельный поток не надо, так как ExecuteOption=[eoAsyncExecute] уже заставляет выполнять запрос в отдельном потоке. Твое дело в нужный момент вызвать метод Cancel.
То что ты выполняешь (Close) - категорически неправильно!!!


 
Vanoid   (2004-03-18 11:12) [4]

Ну отдельный поток тут сделан не для асинхронного вызова, просто он нужен. А насчет ADOCommnd- ты натолкнул меня на мысль: можно результат запроса выгружать в таблицу на сервере(минута- две), причемв любой момент можно оттерминэйтится; а затем забирать данные (20 строк мгновенно). Спасибо!


 
Fiend ©   (2004-03-18 12:02) [5]

а зачем выгружать позволь поинтересоваться?


 
sniknik ©   (2004-03-18 12:18) [6]

при асинхронном выполнении просто лови свой рекордсет в событии ADOConnection1.OnExecuteComplete.


 
Vanoid   (2004-03-19 09:38) [7]

Ну... уже сделал, спасибо, конечно. Просто я не знал, что ADOCommand может мне вернуть датасэт... Переделывать не буду ;)



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
1-1080713994
DimonNew
2004-03-31 10:19
2004.04.18
HTML средствами Delphi


7-1076497137
Terry
2004-02-11 13:58
2004.04.18
Определение точки монтирования диска по имени устройства


6-1076925108
Anatoliy
2004-02-16 12:51
2004.04.18
netbeui


14-1079906051
konstantinov
2004-03-22 00:54
2004.04.18
Посмотрите код. Не слишко ли коряво?


14-1079924342
Думкин
2004-03-22 05:59
2004.04.18
С днем рождения! 22 марта.