Форум: "Базы";
Текущий архив: 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.039 c