|
|
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Подскажите, как лучше поступить при завершении массива потоков. У меня потоки обращаются к Oracle. Для их завершения я использую следующий код: Код: pascal 1. 2. 3. 4. если по каким-либо причинам сервак задумался и ThreadDB[i].oraSession.BreakExecution; не сработало (а такое бывает 100%) и WaitFor длиться вечно, то какими средствами можно корректно завершить приложение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 09:24 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrb, Гарантированно - только TerminateThread, но это плохой подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 10:14 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Есть EndThread, ExitThread Но это зло Особенно если есть инициализируемые и финализируемые данные Лучше выставь адекватный таймаут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 10:20 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
таймаут на waitfor? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 10:23 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbПодскажите, как лучше поступить при завершении массива потоков. У меня потоки обращаются к Oracle. Для их завершения я использую следующий код: Код: pascal 1. 2. 3. 4. Достаточно только Free, в деструкторе уже есть WaitFor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:01 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbесли по каким-либо причинам сервак задумался и ThreadDB[i].oraSession.BreakExecution; не сработало (а такое бывает 100%) и WaitFor длиться вечно Установить TOraSession.Option.ConnectionTimeOut не предлагать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:03 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbПодскажите, как лучше поступить при завершении массива потоков. У меня потоки обращаются к Oracle. Для их завершения я использую следующий код: Код: pascal 1. 2. 3. 4. если по каким-либо причинам сервак задумался и ThreadDB[i].oraSession.BreakExecution; не сработало (а такое бывает 100%) и WaitFor длиться вечно, то какими средствами можно корректно завершить приложение?Кроме того, ты уверен, что OraSession.BreakExecution нужно вызывать в главном потоке, при том что ThreadDB уже с флагом Terminated? Я бы послал потоку сообщение "DoBreakExecution", дождался, и лишь потом дергнул Terminate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:07 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Квейд, в главном потоке, потому что запрос завис/заблокирован на сервере и Terminated ничем не поможет для остановки потока. В компонентах DOA TOracleSession нет такого свойства как TOraSession.Option.ConnectionTimeOut. Это ODAC, наверное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:18 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
А где в методе Free кроется WaitFor? у меня в исходниках только Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:26 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbА где в методе Free кроется WaitFor? у меня в исходниках только Код: pascal 1. 2. КвейдДостаточно только Free, в деструкторе уже есть WaitFor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:31 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbКвейд, в главном потоке, потому что запрос завис/заблокирован на сервере и Terminated ничем не поможет для остановки потока. В компонентах DOA TOracleSession нет такого свойства как TOraSession.Option.ConnectionTimeOut. Это ODAC, наверное.Если выполнение синхронное, просто вызывай BreakExecution из главного, а в обработчике исключений потока делай выход из своего метода Execute. Установи у потока FreeOnTerminate = True, и выделенное спокойно убери. Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:40 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Вот тебе по теме, кстати http://www.sql.ru/forum/888640/vypolnenie-preryvanie-zaprosa-v-otdelnom-potoke-doa-4-1-toracledataset-breakexecution ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:40 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
КвейдВот тебе по теме, кстати http://www.sql.ru/forum/888640/vypolnenie-preryvanie-zaprosa-v-otdelnom-potoke-doa-4-1-toracledataset-breakexecution Почему некоторые считают, что порядок завершения потоков никогда не важен? Я уже не говорю о том, что при таком подходе мягко говоря неудобно перезапускать поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:52 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
КвейдУстанови у потока FreeOnTerminate = True, и выделенное спокойно убери.Не то процитировал. Хотел это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:53 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
КвейдВот тебе по теме, кстати http://www.sql.ru/forum/888640/vypolnenie-preryvanie-zaprosa-v-otdelnom-potoke-doa-4-1-toracledataset-breakexecution Читал, ничего интересного не нашел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 11:59 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
FreeOnTerminate = True, не подходит, нужно перезапускать потоки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 12:00 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
YuRockПочему некоторые считают, что порядок завершения потоков никогда не важен? Полагаю, что автору не важно, в каком порядке будут завершены его запросы-в-потоках. Или пусть автор меня поправит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 12:01 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
Квейд, не важна очередность завершения, важно корректность перезапуска, освобождение ресурсов ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 12:03 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbFreeOnTerminate = True, не подходит, нужно перезапускать потоки Пересоздавать тоже можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 12:16 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
wadman, я это и имел ввиду, но как быть с общими ресурсами? я их очищаю/разрушаю только после разрушения всех доп. потоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 12:21 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbкак быть с общими ресурсами? Это решает программист. Можно оставить и отдать следующему потоку, можно и их создавать для каждого потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 12:23 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
cptngrbА где в методе Free кроется WaitFor? у меня в исходниках только Код: pascal 1. 2. Ты смотришь Free TObject'а. А надо смотреть Destroy TThread'а. Увидишь много нового и интересного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 13:21 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
IMHO & AFAIK Если проблема в том, что BreakExecution не всегда срабатывает на Ваших запросах и есть админские права на сервер, можно поступить жестче, в параллельной сессии с админсками правами ALTER SERVER KILL SESSION, KILL SESSION тоже не всегда помогает, но это все же более грубый/надежный способ, чем Break по сети. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 13:54 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
остается этот вариант рассмотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 14:04 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#18+
wadmancptngrbFreeOnTerminate = True, не подходит, нужно перезапускать потоки Пересоздавать тоже можно. Да, используя дополнительные костыли, типа OnTerminate. В итоге кода получится гораздо больше, чем Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 15:14 |
|
||
|
Гарантировано остановить поток
|
|||
|---|---|---|---|
|
#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?all=1&fid=58&tid=2041062]: |
0ms |
get settings: |
12ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
5ms |
track hit: |
191ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
95ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 584ms |

| 0 / 0 |
