Как да прекъсна заявка, изпълняваща се в отделна нишка
Добър ден на всички.
разгледах пример в bkQuery, доставен с Delphi
и също направи молбата ми в отделна тема
всичко работи добре
но ето как правилно да се прекъсне изпълнението на заявка, ако отнеме твърде много време, за да се освободи правилно нишката
Правилно, по какъвто и да е начин, освен ако използваните компоненти, библиотеки и сървърът не ви позволяват да изпълнявате заявката асинхронно.
Използвам компоненти на BDE TDatabase, сървър TQuery Sybase
какво означава асинхронно?
защо не, защото вече видях такава възможност
ако се свържете чрез QueryAnalizer с MSSQL, тогава можете да изпълните заявка там и ако отнеме твърде много време за изпълнение, спрете го и изпълнете друга заявка
Според мен просто убиваш потока .
Само убиването на нишката може да не помогне, защото на сървъра
транзакцията започва. Конецът може да бъде убит, но трябва да бъде прекъснат
транзакция. За да направите това, трябва изрично да го стартирате. И в потока
активирайте го да се върне, когато убиете потока.
ibase.ru - има много информация за Interbase
можете да убиете нишката в момента, когато заявката вече е завършена, но когато все още не е отворена, тя не работи
опитах се с този код
процедура myThread.destroy
започнете
ако не е спряно, тогава преустановете;
прекратявам;
продължи;
myQuery.free;
myDatabase.free;
наследствено унищожаване;
край;
така че когато правите myQuery.free
възниква изключение с невалидно съобщение
подобно действие, с отворен набор от данни
как правилно да убиете нишка в такава ситуация
а относно транзакцията на сървъра
ако направя myDatabase.rollback, прекъсва ли транзакцията на сървъра или не?
Имам подобна ситуация със Sybase, но базата данни не е моя, как мога да върна транзакцията?
> victor_ch (06.05.03 09:17)
Пребиването на нишката тук няма да помогне на въпроса (особено след като в примера не го заковавате, а просто правите пауза и го оставяте да продължи - Terminate само задава флага Terminated, BDE не знае абсолютно нищо за това, така че няма ефект - нишката пълзи по-нататък). В BDE няма редовни средства. Но.
Съществува такъв двусмислен механизъм за прекъсване на заявки - обратно извикване (по-специално - cbGENPROGRESS, cbCANCELQRY). Разгледайте bde32.hlp. Цялата гадна работа обаче е, че те се извикват не съвсем еднозначно (при някои видове заявки LocalSQL изобщо не ги извиква, макар че за "повечето" заявки всичко работи правилно). За сървъри чрез SQLLinks също се провеждат повиквания, но само в началото (заявката е напуснала) и в края (заявката е пристигнала). Естествено, при извличане връщащата линия също оре.