powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Гарантировано остановить поток
17 сообщений из 42, страница 2 из 2
Гарантировано остановить поток
    #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
17 сообщений из 42, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Гарантировано остановить поток
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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