powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как прервать выполнения зависшей функции
9 сообщений из 34, страница 2 из 2
Как прервать выполнения зависшей функции
    #40007092
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Но плохо, когда после таймаута выполнится то, что ожидалось до истечения таймаута

Поэтому я в таких синхрообъектах по таймауту выбрасываю исключение. В этом случае в лог пишется "за тридцать секунд не удалось наложить вот такую блокировку", поток прерывается, приложение продолжает работать (и в том числе по расписанию повторно пытаться сделать то, что не получилось), а у разработчика есть время и материал подумать, где он накосячил.

YuRock
Мда... Кстати, а как определить, что поток завис?

По тайм-ауту. У меня именно этот способ оказался наиболее подходящим. Я установил, что нормально полный цикл операций выполняется в пределах минуты, при особо большой нагрузке - до пяти минут. Так что тайм-аут в пятнадцать минут практически исключил ложные срабатывания. Но даже если тайм-аут оказался выбран при нормальной работе, ничего страшного - сначала делалась попытка завершить поток мягко, потом, если она не проходила, он срубался по TerminateThread, и в этом случае просто через минуту следующий поток подхватывал ту же задачу с места остановки.
...
Рейтинг: 0 / 0
Как прервать выполнения зависшей функции
    #40007126
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Интересует как сказывается TerminateThread - никаких утечек и глюков не было? Использовался Tthread?
...
Рейтинг: 0 / 0
Как прервать выполнения зависшей функции
    #40007131
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

использовался TThread. TerminateThread показал себя без единого нарекания, куда лучше, чем можно было ожидать. Я в принципе был готов к тому, что в случае его применения то, что не удастся явно освободить, будет теряться со всеми вытекающими, но в итоге сколько бы программа ни работала 24x7, никаких "последствий" заметно так и не было. Конечно, тут большая заслуга вышеупомянутого "пула", но тем не менее - в итоге на полутора десятках серверов она крутилась в режиме "когда вставляется новая железяка - тогда и ребут".
...
Рейтинг: 0 / 0
Как прервать выполнения зависшей функции
    #40007176
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
softwarer,

Интересует как сказывается TerminateThread - никаких утечек и глюков не было? Использовался Tthread?
Ну, если не использовать в потоке критические секции, мьютексы и что-то в этом роде, не выделять временно память (по указателю, который потом не найти), не использовать локальные динамические переменные, не открывать файлы (опять же, которые нельзя будет потом закрыть) и всё прочее - то почему бы и нет.
...
Рейтинг: 0 / 0
Как прервать выполнения зависшей функции
    #40007606
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zelius
softwarer,

Интересует как сказывается TerminateThread - никаких утечек и глюков не было? Использовался Tthread?

TerminateThread же просто завершает выполнение метода Execute . Внутренние поля при этом сохраняются, деструктор их вполне себе очищает
...
Рейтинг: 0 / 0
Как прервать выполнения зависшей функции
    #40007616
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Как прервать выполнения зависшей функции
    #40007745
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zelius
Fr0sT-Brutal,
речь про TerminateThread function

Я знаю.
Крит. секция, если есть, должна быть отдельно обработана убивающим кодом
Память в куче для Дельфи, скорее всего, не актуальна
Остальное тоже вряд ли сыграет. Все-таки убиение потока - нештатная ситуация и не будет происходить каждую минуту
...
Рейтинг: 0 / 0
Как прервать выполнения зависшей функции
    #40007894
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Крит. секция, если есть, должна быть отдельно обработана убивающим кодом

К сожалению, это невозможно сделать из другого (в том числе - убивающего) потока.

Fr0sT-Brutal
Память в куче для Дельфи, скорее всего, не актуальна
А, ну, вам виднее. Не говоря уже о том что при выделении и освобождении памяти "из кучи дельфи" так же может зависнуть крит. секция, которую использует менеджер памяти.

Fr0sT-Brutal
Остальное тоже вряд ли сыграет
Да, я уже понял. Тем более, что кнопка reset потом решит проблему, если она возникнет.
...
Рейтинг: 0 / 0
Как прервать выполнения зависшей функции
    #40008043
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonnik
эксель выкидывает ошибку и процесс останавливается

ExcelApp.DisplayAlerts := False
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как прервать выполнения зависшей функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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