![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отмена запроса, но как ??? [D6, D7, IB6.x, FB]
inic © (2004-06-07 13:58:00)Мое почтение!!!
Есть такой документ:
"Interbase, Firebird, Yaffil FAQ"
( http://www.ibase.ru/v6/ib6faq.htm).
И там сказано:
"...
Теперь на второй вопрос - новое в 6.5:
Возможность снятия долгих запросов (из параллельного
thread)через IB API
...".
Очень хотелось бы узнать, как это сделать ?
Заранее спасибо.
Alexandr (2004-06-08 10:11:00) [1]там же написано
"новое в IB6.5"
вот только запрос если срубить через IB API таким способом, то это с некоторой отличной от нуля вероятностью может привести в той или иной степени к порче базы данных.
Digitman (2004-06-07 15:25:00) [2]
> интересно, что они имеют в виду
если подразумевать уровень совместимости IB и его клонов, то именно трюк с генератором и имелся ввиду
inic (2004-06-07 15:23:00) [3]Была у меня идея отделенно похожая (там даже UDF фигурировали),
но этот способ конечно и лучше, и проще.
Огромное спасибо.
P.S.
Но все таки интересно, что они имеют в виду. Я думаю что-нибудь
типа gds32.dll::gds_query_cancel(...). Кстати, в Yaffil такая отменяющая штука вроде тоже есть.
Digitman (2004-06-07 14:35:00) [4]создается отдельный генератор, например, MyGen
некий код.поток A кл.приложения перед запуском длит.запроса сбрасывает этот генератор в исх.состояние, например, = 0
далее этот же код.поток A вызывает на выполнение некий длит.запрос, в котором кроме прочих WHERE-условий отбора записей фигурирует доп.условие GEN_ID(MyGen, 0) = 0
пока значение ген-ра MyGen равно 0, условие выполняется и запрос продолжает исполняться
одним из ключ.условий прекращения выполнения запроса в этом случае будет НЕвыполнение условия GEN_ID(MyGen, 0) = 0, чего можно достичь, например, инкрементом значения генератора
поскольку код.поток А кл.приложения блокирован в этот момент ожиданием результатов выполнения запроса, он не может инкрементировать генератор MyGen с целью обеспечения ложности упомянутого условия
но ничто не мешает кл.приложению создать вспомогательный код.поток В, который создаст отдельный коннект к той же базе и выполнит в контексте этого коннекта запрос, инкрементирующий значение генератора MyGen
при этом как только выполняющийся длит.запрос обнаружит невыполнение условия GEN_ID(MyGen, 0) = 0, он немедленно прекратит исполнение