|
|
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
YuRock Но плохо, когда после таймаута выполнится то, что ожидалось до истечения таймаута Поэтому я в таких синхрообъектах по таймауту выбрасываю исключение. В этом случае в лог пишется "за тридцать секунд не удалось наложить вот такую блокировку", поток прерывается, приложение продолжает работать (и в том числе по расписанию повторно пытаться сделать то, что не получилось), а у разработчика есть время и материал подумать, где он накосячил. YuRock Мда... Кстати, а как определить, что поток завис? По тайм-ауту. У меня именно этот способ оказался наиболее подходящим. Я установил, что нормально полный цикл операций выполняется в пределах минуты, при особо большой нагрузке - до пяти минут. Так что тайм-аут в пятнадцать минут практически исключил ложные срабатывания. Но даже если тайм-аут оказался выбран при нормальной работе, ничего страшного - сначала делалась попытка завершить поток мягко, потом, если она не проходила, он срубался по TerminateThread, и в этом случае просто через минуту следующий поток подхватывал ту же задачу с места остановки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2020, 19:38 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
softwarer, Интересует как сказывается TerminateThread - никаких утечек и глюков не было? Использовался Tthread? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2020, 21:00 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Zelius, использовался TThread. TerminateThread показал себя без единого нарекания, куда лучше, чем можно было ожидать. Я в принципе был готов к тому, что в случае его применения то, что не удастся явно освободить, будет теряться со всеми вытекающими, но в итоге сколько бы программа ни работала 24x7, никаких "последствий" заметно так и не было. Конечно, тут большая заслуга вышеупомянутого "пула", но тем не менее - в итоге на полутора десятках серверов она крутилась в режиме "когда вставляется новая железяка - тогда и ребут". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2020, 21:09 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Zelius softwarer, Интересует как сказывается TerminateThread - никаких утечек и глюков не было? Использовался Tthread? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 00:20 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Zelius softwarer, Интересует как сказывается TerminateThread - никаких утечек и глюков не было? Использовался Tthread? TerminateThread же просто завершает выполнение метода Execute . Внутренние поля при этом сохраняются, деструктор их вполне себе очищает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 10:29 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal, речь про TerminateThread function MSDNTerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems: If the target thread owns a critical section, the critical section will not be released. If the target thread is allocating memory from the heap, the heap lock will not be released. If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent. If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL. A thread cannot protect itself against TerminateThread, other than by controlling access to its handles. The thread handle returned by the CreateThread and CreateProcess functions has THREAD_TERMINATE access, so any caller holding one of these handles can terminate your thread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 10:52 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Zelius Я знаю. Крит. секция, если есть, должна быть отдельно обработана убивающим кодом Память в куче для Дельфи, скорее всего, не актуальна Остальное тоже вряд ли сыграет. Все-таки убиение потока - нештатная ситуация и не будет происходить каждую минуту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 14:51 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal Крит. секция, если есть, должна быть отдельно обработана убивающим кодом К сожалению, это невозможно сделать из другого (в том числе - убивающего) потока. Fr0sT-Brutal Память в куче для Дельфи, скорее всего, не актуальна Fr0sT-Brutal Остальное тоже вряд ли сыграет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 23:28 |
|
||
|
|

start [/forum/topic.php?fid=58&gotonew=1&tid=2037935]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
5ms |
get first new msg: |
3ms |
get forum data: |
2ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 403ms |

| 0 / 0 |
