|
|
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
не буду я FreeOnTerminate = True использовать. Вообще какая разница как завершать, если до выхода из Execute дело не доходит. Вопрос как сессию срубить? Как я понял, нужно делать еще одну сессию и пробовать убивать сессию Код: pascal 1. , а если и это не поможет, то грохать поток TerminateThread , ну а что остается? или: 1. Создали поток и выставили FreeOnTerminate = True 2. Посылаем ему сигнал Terminate; 3. В доп. потоке он застрял в Execute так как сигнал не пришел об остановке запроса 4. Главный поток рубит доп. поток и еще какое-то время процесс висит в системе 5. В это время создается новый доп. поток 6. ждем следующего затыка.... сессий свободных все меньше и меньше, вешаем сервак , вернее он говорит, что сессий свободных нет - приходите завтра ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 15:28 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrb, Самый лучший вариант: не делать запросов, которые могут зависнуть надолго (которые ты пытаешься прервать через BreakSession). И тогда - просто ждать, пока отработает execute. cptngrbа если и это не поможет, то грохать поток TerminateThread , ну а что остается? Забудь об этом варианте. Останется всё: незакрытая сессия, неосвобожденные хэндлы, неосвобожденная память, невзведенные события... Полный хаос, короче. Лучше сразу TerminateProcess (что, кстати, можно было бы делать, если бы ты использовал для своей задачи не доп. потоки, а доп. процессы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 15:38 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
ну а как тогда быть? ждать пока сработает BreakExecution, однажды я ждал больше 2 часов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 15:44 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbну а как тогда быть? ждать пока сработает BreakExecution, однажды я ждал больше 2 часов. Вижу 2 варианта: 1. YuRockСамый лучший вариант: не делать запросов, которые могут зависнуть надолго (которые ты пытаешься прервать через BreakSession) 2. YuRockЛучше сразу TerminateProcess (что, кстати, можно было бы делать, если бы ты использовал для своей задачи не доп. потоки, а доп. процессы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 15:47 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbкак тогда быть?YuRockЛучше сразу TerminateProcess (что, кстати, можно было бы делать, если бы ты использовал для своей задачи не доп. потоки, а доп. процессы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 15:47 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Трудный, но 100% результата, путь - пускать запросы в отдельных процессах, вот процессы можно грохать спокойно и безопасно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 16:03 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Zelius, или в TTask можно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 16:39 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbне буду я FreeOnTerminate = True использовать. Вообще какая разница как завершать, если до выхода из Execute дело не доходит. Вопрос как сессию срубить? Как это до выхода Execute дело не доходит? В первом посту, что у вас в первой строке? Код: pascal 1. Остальные строки за ней нужно перенести в OnTerminate! И уже в OnTerminate можно попробовать убить сессию Oracle. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 16:56 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Belotsky Serge, не надо нести пургу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 17:00 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Belotsky Serge, ThreadDB[i].Terminate; только выставляет флаг Terminated:= True и все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 17:01 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Тут намешаны в одну кучу несколько разных вопросов. Их стоит разложить отдельно. Во-первых, лучший способ обрубить оракловую сессию - выполнить команду alter system disconnect session ... immediate . В отличие от kill session в результате этой команды сессия практически всегда завершается довольно быстро. Во-вторых, с точки зрения клиентского приложения ждать завершения сессии совершенно незачем, если только приложение не делает в оракловой базе чего-то потрясающе нелепого. Лично я, когда делал приложение 24x7x365, поступал очень просто: пул сессий, при старте потока ему из пула выделяется сессия, если не было ошибок - сессия возвращается в пул, если были - откладывается в сторону медленно умирать и освобождаться. Disconnect session при этом нужен для того, чтобы снять блокировки в базе - иначе при следующей попытке следующий поток повиснет уже на тех блокировках и снова не сможет сработать. Ну и наконец, если приложение должно завершиться, это можно совершенно спокойно делать, не дожидаясь конца оракловых сессий. База просечёт исчезновение клиента и сама подчистит всё необходимое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 18:48 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
softwarer, допустим в доп. потоке Execute Код: pascal 1. 2. OracleQuery.Execute выполняется очень-очень долго и завершиться нормально не может. В основном потоке я вызываю OracleSession.BreakExecution и в 99,99 % OracleQuery.Execute завершается с ошибкой и спокойно выходим из цикла. Но! в 0,01 % OracleSession.BreakExecution не срабатывает и начинаются танцы с бубном. Если не сложно покажите кусок кода, который реализует вашу логику ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 19:32 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
YuRockBelotsky Serge, не надо нести пургу. В чем пурга? Если дополнительный поток работает с Oracle, то может сначала дождаться окончания Execute? А сессию убивать нужно в основном потоке (точнее в том, в котором сессия создается). А так как он делает в первом посте, очень стрёмно, сообщает дополнительному потоку завершиться, тут же пытается убить сессию, с которой этот дополнительный поток возможно еще работает, а потом становится на WaitFor? Я бы так не делал. Я бы дождался окончания выполнения последнего Query, затем проверил бы флаг Terminated и спокойно завершил бы дополнительный поток, а там можно нормально закрыть сессию (а не так жестко Break). А если флаг Terminated не проверяется в Execute, то это его проблемы. Можно конечно убить сессию в Execute сразу за циклом while. Можно много чего... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 07:56 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Belotsky SergeYuRockBelotsky Serge, не надо нести пургу. В чем пурга? ... PS: Да, конечно, в OnTerminate WaitFor уже не нужен, поток то уже завершен. И вообще я стараюсь избегать FreeOnTerminate=false. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 08:02 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Belotsky Serge, видимо не внимательно читаете. Execute потока и Execute запроса путаете, наверное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 08:11 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbв 99,99 % OracleQuery.Execute завершается с ошибкой и спокойно выходим из цикла. Но! в 0,01 % OracleSession.BreakExecution не срабатывает и начинаются танцы с бубномна мой взгляд траблы случаются при этом почаще и порой все приложение после этого становится нестабильным вплоть до рестарта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 09:26 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Belotsky SergeВ чем пурга?Мда... Вообще-то 1-е апреля уже прошло. Или Вам надо вопрос темы и всю почитать... Впрочем, после этого Belotsky Sergeя стараюсь избегать FreeOnTerminate=false.думаю смысла особого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 09:41 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39624323&tid=2041062]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
157ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 442ms |

| 0 / 0 |
