C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Прервать выполнение запроса асинхронно, ADOQuery & Postgre
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
в теме указана субд и компонент

yu.gif Пропустил подзаголовок. При ответе его не видно.

У 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

Вернуться в Работа с базами данных в C++Builder