powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Гарантировано остановить поток
42 сообщений из 42, показаны все 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
Гарантировано остановить поток
    #39624223
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не буду я FreeOnTerminate = True использовать. Вообще какая разница как завершать, если до выхода из Execute дело не доходит. Вопрос как сессию срубить?
Как я понял, нужно делать еще одну сессию и пробовать убивать сессию
Код: pascal
1.
alter system kill session x,y immediate

, а если и это не поможет, то грохать поток TerminateThread , ну а что остается?
или:
1. Создали поток и выставили FreeOnTerminate = True
2. Посылаем ему сигнал Terminate;
3. В доп. потоке он застрял в Execute так как сигнал не пришел об остановке запроса
4. Главный поток рубит доп. поток и еще какое-то время процесс висит в системе
5. В это время создается новый доп. поток
6. ждем следующего затыка.... сессий свободных все меньше и меньше, вешаем сервак , вернее он говорит, что сессий свободных нет - приходите завтра
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624227
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Самый лучший вариант: не делать запросов, которые могут зависнуть надолго (которые ты пытаешься прервать через BreakSession).
И тогда - просто ждать, пока отработает execute.

cptngrbа если и это не поможет, то грохать поток TerminateThread , ну а что остается?
Забудь об этом варианте. Останется всё: незакрытая сессия, неосвобожденные хэндлы, неосвобожденная память, невзведенные события... Полный хаос, короче. Лучше сразу TerminateProcess (что, кстати, можно было бы делать, если бы ты использовал для своей задачи не доп. потоки, а доп. процессы).
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624229
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну а как тогда быть? ждать пока сработает BreakExecution, однажды я ждал больше 2 часов.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624231
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbну а как тогда быть? ждать пока сработает BreakExecution, однажды я ждал больше 2 часов.
Вижу 2 варианта:
1.
YuRockСамый лучший вариант: не делать запросов, которые могут зависнуть надолго (которые ты пытаешься прервать через BreakSession)
2.
YuRockЛучше сразу TerminateProcess (что, кстати, можно было бы делать, если бы ты использовал для своей задачи не доп. потоки, а доп. процессы)
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624232
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbкак тогда быть?YuRockЛучше сразу TerminateProcess (что, кстати, можно было бы делать, если бы ты использовал для своей задачи не доп. потоки, а доп. процессы
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624242
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трудный, но 100% результата, путь - пускать запросы в отдельных процессах, вот процессы можно грохать спокойно и безопасно.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624260
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius, или в TTask можно
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624269
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cptngrbне буду я FreeOnTerminate = True использовать. Вообще какая разница как завершать, если до выхода из Execute дело не доходит. Вопрос как сессию срубить?

Как это до выхода Execute дело не доходит?
В первом посту, что у вас в первой строке?
Код: pascal
1.
ThreadDB[i].Terminate; 



Остальные строки за ней нужно перенести в OnTerminate! И уже в OnTerminate можно попробовать убить сессию Oracle.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624272
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge, не надо нести пургу.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624274
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge, ThreadDB[i].Terminate; только выставляет флаг Terminated:= True и все
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624323
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут намешаны в одну кучу несколько разных вопросов. Их стоит разложить отдельно.

Во-первых, лучший способ обрубить оракловую сессию - выполнить команду alter system disconnect session ... immediate . В отличие от kill session в результате этой команды сессия практически всегда завершается довольно быстро. Во-вторых, с точки зрения клиентского приложения ждать завершения сессии совершенно незачем, если только приложение не делает в оракловой базе чего-то потрясающе нелепого. Лично я, когда делал приложение 24x7x365, поступал очень просто: пул сессий, при старте потока ему из пула выделяется сессия, если не было ошибок - сессия возвращается в пул, если были - откладывается в сторону медленно умирать и освобождаться. Disconnect session при этом нужен для того, чтобы снять блокировки в базе - иначе при следующей попытке следующий поток повиснет уже на тех блокировках и снова не сможет сработать. Ну и наконец, если приложение должно завершиться, это можно совершенно спокойно делать, не дожидаясь конца оракловых сессий. База просечёт исчезновение клиента и сама подчистит всё необходимое.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624341
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, допустим в доп. потоке Execute
Код: pascal
1.
2.
while not Terminated do
OracleQuery.Execute;



OracleQuery.Execute выполняется очень-очень долго и завершиться нормально не может.
В основном потоке я вызываю OracleSession.BreakExecution и в 99,99 % OracleQuery.Execute завершается с ошибкой и спокойно выходим из цикла. Но! в 0,01 % OracleSession.BreakExecution не срабатывает и начинаются танцы с бубном.
Если не сложно покажите кусок кода, который реализует вашу логику
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624450
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockBelotsky Serge, не надо нести пургу.

В чем пурга? Если дополнительный поток работает с Oracle, то может сначала дождаться окончания Execute? А сессию убивать нужно в основном потоке (точнее в том, в котором сессия создается). А так как он делает в первом посте, очень стрёмно, сообщает дополнительному потоку завершиться, тут же пытается убить сессию, с которой этот дополнительный поток возможно еще работает, а потом становится на WaitFor? Я бы так не делал. Я бы дождался окончания выполнения последнего Query, затем проверил бы флаг Terminated и спокойно завершил бы дополнительный поток, а там можно нормально закрыть сессию (а не так жестко Break).

А если флаг Terminated не проверяется в Execute, то это его проблемы.

Можно конечно убить сессию в Execute сразу за циклом while. Можно много чего...
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624453
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Belotsky SergeYuRockBelotsky Serge, не надо нести пургу.

В чем пурга? ...

PS: Да, конечно, в OnTerminate WaitFor уже не нужен, поток то уже завершен. И вообще я стараюсь избегать FreeOnTerminate=false.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624456
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge, видимо не внимательно читаете. Execute потока и Execute запроса путаете, наверное.
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624479
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbв 99,99 % OracleQuery.Execute завершается с ошибкой и спокойно выходим из цикла. Но! в 0,01 % OracleSession.BreakExecution не срабатывает и начинаются танцы с бубномна мой взгляд траблы случаются при этом почаще и порой все приложение после этого становится нестабильным вплоть до рестарта
...
Рейтинг: 0 / 0
Гарантировано остановить поток
    #39624487
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky SergeВ чем пурга?Мда... Вообще-то 1-е апреля уже прошло.
Или Вам надо вопрос темы и всю почитать... Впрочем, после этого
Belotsky Sergeя стараюсь избегать FreeOnTerminate=false.думаю смысла особого нет.
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Гарантировано остановить поток
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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