powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Гарантировано остановить поток
25 сообщений из 42, страница 1 из 2
Гарантировано остановить поток
    #39624018
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как лучше поступить при завершении массива потоков. У меня потоки обращаются к Oracle.
Для их завершения я использую следующий код:

Код: pascal
1.
2.
3.
4.
ThreadDB[i].Terminate; 
ThreadDB[i].oraSession.BreakExecution;
ThreadDB[i].WaitFor;
ThreadDB[i].Free;



если по каким-либо причинам сервак задумался и ThreadDB[i].oraSession.BreakExecution; не сработало (а такое бывает 100%) и WaitFor длиться вечно, то какими средствами можно корректно завершить приложение?
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624036
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Гарантированно - только TerminateThread, но это плохой подход.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624043
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть EndThread, ExitThread
Но это зло
Особенно если есть инициализируемые и финализируемые данные

Лучше выставь адекватный таймаут
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624045
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таймаут на waitfor?
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624063
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbПодскажите, как лучше поступить при завершении массива потоков. У меня потоки обращаются к Oracle.
Для их завершения я использую следующий код:

Код: pascal
1.
2.
3.
4.
ThreadDB[i].Terminate; 
ThreadDB[i].oraSession.BreakExecution;
ThreadDB[i].WaitFor;
ThreadDB[i].Free;


Достаточно только Free, в деструкторе уже есть WaitFor.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624066
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbесли по каким-либо причинам сервак задумался и ThreadDB[i].oraSession.BreakExecution; не сработало (а такое бывает 100%) и WaitFor длиться вечно
Установить TOraSession.Option.ConnectionTimeOut не предлагать?
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624068
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbПодскажите, как лучше поступить при завершении массива потоков. У меня потоки обращаются к Oracle.
Для их завершения я использую следующий код:

Код: pascal
1.
2.
3.
4.
ThreadDB[i].Terminate; 
ThreadDB[i].oraSession.BreakExecution;
ThreadDB[i].WaitFor;
ThreadDB[i].Free;



если по каким-либо причинам сервак задумался и ThreadDB[i].oraSession.BreakExecution; не сработало (а такое бывает 100%) и WaitFor длиться вечно, то какими средствами можно корректно завершить приложение?Кроме того, ты уверен, что OraSession.BreakExecution нужно вызывать в главном потоке, при том что ThreadDB уже с флагом Terminated? Я бы послал потоку сообщение "DoBreakExecution", дождался, и лишь потом дергнул Terminate.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624072
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд, в главном потоке, потому что запрос завис/заблокирован на сервере и Terminated ничем не поможет для остановки потока. В компонентах DOA TOracleSession нет такого свойства как TOraSession.Option.ConnectionTimeOut. Это ODAC, наверное.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624079
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где в методе Free кроется WaitFor?
у меня в исходниках только
Код: pascal
1.
2.
if Self <> nil then
 Destroy;
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624088
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbА где в методе Free кроется WaitFor?
у меня в исходниках только
Код: pascal
1.
2.
if Self <> nil then
 Destroy;



КвейдДостаточно только Free, в деструкторе уже есть WaitFor.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624093
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbКвейд, в главном потоке, потому что запрос завис/заблокирован на сервере и Terminated ничем не поможет для остановки потока. В компонентах DOA TOracleSession нет такого свойства как TOraSession.Option.ConnectionTimeOut. Это ODAC, наверное.Если выполнение синхронное, просто вызывай BreakExecution из главного, а в обработчике исключений потока делай выход из своего метода Execute. Установи у потока FreeOnTerminate = True, и выделенное спокойно убери.

Код: pascal
1.
2.
3.
4.
ThreadDB[i].Terminate; 
ThreadDB[i].oraSession.BreakExecution;
ThreadDB[i].WaitFor;
ThreadDB[i].Free;
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624095
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624100
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдВот тебе по теме, кстати

http://www.sql.ru/forum/888640/vypolnenie-preryvanie-zaprosa-v-otdelnom-potoke-doa-4-1-toracledataset-breakexecution Почему некоторые считают, что порядок завершения потоков никогда не важен?
Я уже не говорю о том, что при таком подходе мягко говоря неудобно перезапускать поток.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624101
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдУстанови у потока FreeOnTerminate = True, и выделенное спокойно убери.Не то процитировал. Хотел это.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624104
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдВот тебе по теме, кстати

http://www.sql.ru/forum/888640/vypolnenie-preryvanie-zaprosa-v-otdelnom-potoke-doa-4-1-toracledataset-breakexecution

Читал, ничего интересного не нашел
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624105
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreeOnTerminate = True, не подходит, нужно перезапускать потоки
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624106
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockПочему некоторые считают, что порядок завершения потоков никогда не важен?
Полагаю, что автору не важно, в каком порядке будут завершены его запросы-в-потоках. Или пусть автор меня поправит.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624108
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд, не важна очередность завершения, важно корректность перезапуска, освобождение ресурсов ...
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624115
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbFreeOnTerminate = True, не подходит, нужно перезапускать потоки
Пересоздавать тоже можно.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624118
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, я это и имел ввиду, но как быть с общими ресурсами? я их очищаю/разрушаю только после разрушения всех доп. потоков?
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624120
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbкак быть с общими ресурсами?
Это решает программист. Можно оставить и отдать следующему потоку, можно и их создавать для каждого потока.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624159
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbА где в методе Free кроется WaitFor?
у меня в исходниках только
Код: pascal
1.
2.
if Self <> nil then
 Destroy;



Ты смотришь Free TObject'а. А надо смотреть Destroy TThread'а. Увидишь много нового и интересного.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624179
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO & AFAIK

Если проблема в том, что BreakExecution не всегда срабатывает на Ваших запросах и есть админские права на сервер, можно поступить жестче, в параллельной сессии с админсками правами ALTER SERVER KILL SESSION,

KILL SESSION тоже не всегда помогает, но это все же более грубый/надежный способ, чем Break по сети.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624183
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
остается этот вариант рассмотреть
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624216
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmancptngrbFreeOnTerminate = True, не подходит, нужно перезапускать потоки
Пересоздавать тоже можно.
Да, используя дополнительные костыли, типа OnTerminate. В итоге кода получится гораздо больше, чем
Код: pascal
1.
2.
ThreadDB[i].Free;
ThreadDB[i] := TThreadDB.Create;
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Гарантировано остановить поток
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]