Guest |
Отправлено: 12.03.2007, 15:45 |
|
Не зарегистрирован
|
Юзер вызывает ХП, которая может выполняться юхову тучу времени. В другом потоке висит окошко, в котором кнопочка. нажимаем — происходит обрыв запроса.
как лучше сделать такую хрень? то есть окно и кнопочка есть, колбэк тоже есть, который вызывается при нажатии на кнопочку. Но что дальше?.. |
|
Tertium |
Отправлено: 12.03.2007, 15:47 |
|
Машинист паровоза
Группа: Почетный участник
Сообщений: 192
|
блин зарегица забыл
|
|
AVC |
Отправлено: 12.03.2007, 16:13 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Запрос выполняется в отдельном потоке, желательно без использования vcl.
Окно с кнопкой в основном потоке. На окне, по желанию и возможностям, может быть некая справочная информация о ходе выполнения запроса. Нажатие кнопки, после совещания с юсером, убивает поток запроса и не забывает известить сервер об отмене операции.
Вариант "в металле" зависит от субд и компонентов доступа. |
|
Tertium |
Отправлено: 12.03.2007, 16:19 |
|
Машинист паровоза
Группа: Почетный участник
Сообщений: 192
|
в теме указана субд и компонент.
конкретно — запрос селект к посгрешному локальному серверу, контрол — ADOQuery.
вызывается Open(select...)
как его остановить?
|
|
AVC |
Отправлено: 12.03.2007, 17:03 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE | в теме указана субд и компонент |
Пропустил подзаголовок. При ответе его не видно.
У PostGre не знаю (у oracle есть спец. команда).
Можно попробовать выполнять в отдельной сессии и при нужде убивать её. |
|
Tertium |
Отправлено: 12.03.2007, 17:51 |
|
Машинист паровоза
Группа: Почетный участник
Сообщений: 192
|
да нет, как оставновить выполнение запроса внутри TADOQuery?
доступ к постгре через олепровайдера, поэтому даже если б было, не вызвать никакую фцию самой постгры
|
|
AVC |
Отправлено: 13.03.2007, 09:13 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Посмотрите у "постгры" можно ли из одной сессии убить другую. Если да, то проблема решена. |
|
Tertium |
Отправлено: 13.03.2007, 10:36 |
|
Машинист паровоза
Группа: Почетный участник
Сообщений: 192
|
и правда такая фция есть — pg_cancel_backend — ищем по тексту запроса наш процесс и шлем ему сигнал отмены. у меня в долгих запросах присутствуют вызовы моих же фций — get_all_ci, get_ci, get_ai. вот хранимка на постгрешном plsql:
SQL | CREATE OR REPLACE FUNCTION kill_long_queries()
RETURNS integer AS $BODY$
declare
process_id int;
res boolean;
begin for process_id in select procpid from pg_stat_activity where position('get_all_ci' in current_query) > 0 or position('get_ci' in current_query) > 0 or position('get_ai' in current_query) > 0
loop
select into res pg_cancel_backend(process_id);
end loop;
if (res = 't') then
return 1;
else
return 0;
end if;
end
$BODY$
LANGUAGE 'plpgsql';
|
|
|
Tertium |
Отправлено: 13.03.2007, 11:29 |
|
Машинист паровоза
Группа: Почетный участник
Сообщений: 192
|
тока почемуто создание в параллельном потоке TADOConnection ни фига не заканчивает потоки, хотя та же ф-ция, вызванная в окне pgAdmin процесс обрывает
----
вобщем пришлось создавать екзешник дополнительный — потому что только из друго процесса обрыв сессии нормально работает. уж не знаю почему. а в главной программе делать на нажатие кнопки — CreateProcess(...)
Отредактировано Tertium — 13.03.2007, 13:48
|
|