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

Вниз

Как прервать запрос запущенный в отдельном потоке   Найти похожие ветки 

 
victor_ch   (2003-05-01 11:26) [0]

Добрый день Всем!!!

посмотрел пример в bkQuery поставляемый вместе с Delphi
и сделал также свой запрос в отдельном потоке
все прекрасно работает
но вот как правильно прерывать выполнение запроса, если он слишком долго выполняется, чтобы происходило правильное освобождение потока


 
Suntechnic   (2003-05-01 17:55) [1]

Корректно- никак, если только используемые компоненты, библиотеки и сервер не позволяют запустить запрос асинхронно.


 
victor_ch   (2003-05-02 07:50) [2]

использую компоненты BDE TDatabase,TQuery сервер Sybase
что значит асинхронно?

почему никак нельзя, ведь я уже видел такую возможность
если подключаться через QueryAnalizer к MSSQL то там можно запустить запрос и если он слишком долго выполняется, то остановить его, и запустить какой-то другой запрос


 
AnduKiss   (2003-05-02 17:35) [3]

По моему просто убиваешь поток ...


 
sunrider   (2003-05-03 01:18) [4]

Просто убить поток может не помочь, потому что на сервере
стартует транзакция. Поток можно убить, но необходимо прервать
транзакцию. Для этого ее нужно явно запустить. И в потоке
дать возможность ее откатить, когда убиваешь поток.
ibase.ru - там много инфы об Interbase


 
victor_ch   (2003-05-06 09:17) [5]

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

procedure myThread.destroy
begin
if not suspended then suspend;
terminate;
resume;
myQuery.free;
myDatabase.free;
inherited destroy;
end;

так вот при выполнении myQuery.free
происходит исключительная ситуация с сообщением о недопустимости
подобного действия, при открытом датасете

как корректно убить поток, в такой ситуации
а по поводу транзакции на сервере
если я делаю myDatabase.rollback - это прерывает транзакцию на сервере или нет?


 
sapsi   (2003-05-06 09:36) [6]

У меня похожая ситуация с Sybase, но база не у меня, как я могу откатить транзакцию?


 
Dred2k   (2003-05-06 10:08) [7]


> victor_ch (06.05.03 09:17)

Прибитием потока тут делу не поможешь (тем более, что в примере ты его не прибиваешь, а просто приостанавливаешь и пускаешь дальше - Terminate лишь флаг Terminated выставляет, BDE о нем абсолютно ничего не знает, поэтому эффекта никакого - нить ползет дальше). Штатных средств в BDE нет. Но...
Есть такой не совсем однозначный механизм для прерывания запросов - callback-и (в частности - cbGENPROGRESS, cbCANCELQRY). Изучи в bde32.hlp. Однако, вся гадость в том, что вызываются они не вполне однозначно (на некоторых типах запросов LocalSQL их вообще не вызывает, хотя для "большинства" запросов все работает корректно). Для серверов через SQLLinks вызовы тоже имеют место быть, но лишь в начале (запрос ушел) и в конце (запрос пришел). Естественно, при fetch-е обратка тоже пашет.
Пробуй cbCANCELQRY - судя по хелпу, он для Sybase и предназначен, хотя вызывается и в LocalSQL. :) Может, тебе повезет.
А нить не прибьешь корректно. Когда пошел вызов Query.Open или .ExcecSQL, начинает работать код BDE, за внутренними ресурсами уже не уследишь. При этом закрыть или уничтожить объекты TDatabase и иже с ним - тоже не получится (bde использует синхрообъекты, по ходу, поэтому получается клинч).
Так что вопрос ты поднял нехилый! ;)
На последок небольшой хинт - если заюзаешь callback-и и они начнут вызываться при запросе, но BDE не среагирует на код прерывания запроса (cbrABORT), то просто грохни в обработчике любым экцепшеном - и BDE прервет выполнение по-любому. Только вот при этом фатально потеряются внутренние ресурсы и BDE вскоре рухнет (проверено).
;)


 
Fiend   (2003-05-06 11:20) [8]

Не дизинформируйте и не пугайте человека.

На БДЕ для MSSQL и Sybase, это делается на раз два три.
При помощи вышеупомянутого колобка.

Определяем функцию колобка в классе формы, например
function CancelCallBackFunction(cbInfo : Pointer): CBRType;
Определяем переменную колобка
CancelCallBack: TBDECallBack;

далее сама функция

function TData_Module.CancelCallBackFunction(cbInfo : Pointer): CBRType;
begin
//здесь проверяется на необходимость прервать запрос
if StopGenerating then Result:=cbrAbort;
end;

//Это напрмиер пере созданием потока
if CancelCallBack=nil then CancelCallBack:=TBDECaLLbACK.Create(Session,nil,cbCANCELQRY,nil,0,CancelCallBackFunction,true);//Регистрирование функции обратного вызова

После того как вы зарегистрировали колобок, он будет периодически вызываться самим БДЕ

Не забудьте потом освободить колобка
CallBack.Free;

Да, и надо еще в параметрах драйвера MS SQL установить как написано в справке БДЕ
By default, SQL statements sent to MS SQL and Sybase servers using DB-Lib are now sent using the synchronous query submission API. Earlier versions of SQL Links used the asynchronous query submission API. To use the asynchronous query submission API, add 2048 to the current value of DRIVER FLAGS or set it to 2048 if it"s blank.

Отмену можно делать и при использовании АДО и ОДБЦ.


 
Dred2k   (2003-05-06 11:36) [9]


> Не дизинформируйте и не пугайте человека.

И даже в мыслях не было! ;)

> На БДЕ для MSSQL и Sybase, это делается на раз два три.
> При помощи вышеупомянутого колобка.

Так в чем дезинформация?
> Пробуй cbCANCELQRY - судя по хелпу, он для Sybase и предназначен



 
Fiend   (2003-05-07 09:42) [10]

То Dred2k:
Прошу прощения, забыл приписать, что хотел подтвердить примером именно ваши слова. Это относится к остальным наводившим шорох


 
victor_ch   (2003-05-07 11:24) [11]

то Fiend:
пробую с CancelCallBackFunction
только вот не понятно такое место

>//здесь проверяется на необходимость прервать запрос
>if StopGenerating then Result:=cbrAbort;
что такое StopGenerating у меня в этом месте выдает ошибку при компиляции

есть ли рабочий пример, или кусок кода?
а то в справке очень ограниченная информация



 
victor_ch   (2003-05-07 15:20) [12]

ау мастера


 
Fiend   (2003-05-07 15:57) [13]

StopGenerating - у меня это функция которая определеят надо ли прервать запрос. т.е грубо говоря юзер нажал на кнопку отмена, в связи с этим установился флаг(переменная).
А вышеупомянутая функция определякет просто напросто состояние этого флага, вот и всё



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

Форум: "Базы";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.009 c
3-94746
Barman
2003-05-09 14:45
2003.05.29
ADO


7-95137
Konstantionov
2003-03-31 12:18
2003.05.29
Работа с реестром


7-95145
demonyator
2003-03-28 18:30
2003.05.29
Как в XP вместо explorer a загружать свою прогу ?


14-95100
Style
2003-04-24 19:51
2003.05.29
Delphi Challenge: И все-таки нужно подумать.


3-94773
Sirus
2003-05-12 09:57
2003.05.29
Сдается мне что FireBird работает медленне чем Interbase...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский