Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Вниз

Офигеете: отмена выполнения асинхронных запросов 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
1-1080566510
TButton
2004-03-29 17:21
2004.04.18
Сравнить 2 record а


14-1079762597
Alex Konshin
2004-03-20 09:03
2004.04.18
Купил новую машину


4-1076853515
Rival
2004-02-15 16:58
2004.04.18
Чатота экрана


6-1072497941
john
2003-12-27 07:05
2004.04.18
виснет клиент из примера по Indy (Chat)


1-1080820738
Анна
2004-04-01 15:58
2004.04.18
Как программно вставить текст в RichEdit на место курсора?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский