|
|
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Есть функция которая запускается раз в пол часа. Она в свою очередь запускает до сотни других функций. В результате выполнения функция может упасть по разным причинам в одной из этих под функций. Например потерялась связь с сервером бд и еще куча непредвиденных причин. В результате процесс останавливается и не идет дальше. А по факту, если случилась непредвиденная ошибка и процесс остановился, то в случае бездействия в течении 10 мин функция должна завершиться и перезапуститься. Более правильный пример это когда открывается файл экселя, а он оказывается битым или заблокированным. И тут сам эксель выкидывает ошибку и процесс останавливается. В этом случае через 10 мин процесс должен завершиться и начаться заново для обработки других файлов. Можно в потоке проверять зависло или не зависло. Но я не знаю как завершить работу зависшей функции. А запускать эту функции в потоке не хочу, врятли она будет в нем адекватно работать, а переделать ее под поток займет много времени. Может есть вариант проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 22:24 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
искать заведомо кривой костыль для подпирания такого же заведомо кривого кода...отличный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 22:27 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Jonnik переделать ее под поток займет много времени. Не так уж и много. Если сделать ее выполнение через synchronize / queue , то она должна выполняться в контексте основного потока. Там ее можно будет обернуть в многочисленные try..except/try..finally, понаставить флажков ... вообщем, для велосипедостроения куча возможностей :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 22:35 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Док Jonnik переделать ее под поток займет много времени. Не так уж и много. Если сделать ее выполнение через synchronize / queue , то она должна выполняться в контексте основного потока. Там ее можно будет обернуть в многочисленные try..except/try..finally, понаставить флажков ... вообщем, для велосипедостроения куча возможностей :) Там 30 000 строк. Я не уверен, что это будет так уже быстро ее адаптировать для потока. Поэтому и спрашиваю. Может есть другой способ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 22:56 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Док, Per anus ad astra.)) Зачем ему в таком случае поток вообще?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 23:00 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
JonnikНапример потерялась связь с сервером бд и еще куча непредвиденных причин. В результате процесс останавливается и не идет дальше. В этот момент к нему удобно подключиться отладчиком, посмотреть на эту непредвиденную причину и сделать её предвиденной, не вызывающей зависание. Повторять до полного упокоения непредвиденных причин. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 23:05 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Jonnik Там 30 000 строк. Я не уверен, что это будет так уже быстро ее адаптировать для потока. Поэтому и спрашиваю. Может есть другой способ. если функция останавливает основной поток, то 1) либо внутри функции нужно предусматривать выход из нее по наступлении определенных условий, 2) либо делать ее в потоке. Но и там в потоке придется делать п.1 Vlad F Зачем ему в таком случае поток вообще?)) ты у меня спрашиваешь? Я предположил, что это не так сложно, пока не узнал про 30К строк кода :) Vlad F Per anus ad astra.)) а вот удивительно, но в жизни делание некоторых вещей per anus - самый оптимальный вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 23:12 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Док, 1) У тебя, потому что это ты ему такие советы советуешь.)) 2) Ещё раз, - зачем тогда ему этот фейковый поток вообще, если его потом предлагается проецировать на основной и отслеживаться уже в нем? Пусть тогда сразу в основном и отлаживается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 23:29 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov JonnikНапример потерялась связь с сервером бд и еще куча непредвиденных причин. В результате процесс останавливается и не идет дальше. В этот момент к нему удобно подключиться отладчиком, посмотреть на эту непредвиденную причину и сделать её предвиденной, не вызывающей зависание. Повторять до полного упокоения непредвиденных причин. Это не совсем вариант так как есть ошибки самих компонентов, которые происходят редко. Например закончились ресурсы GDI. У меня нет желания решать вопрос почему на каком-то этапе прорисовки окна с DevExpress в редких случаях вылетает такая ошибка и все останавливается. Или почему эксель может вылететь 10 способами. (Это хоть можно предусматреть) Но проще убить этот процесс и начать заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2020, 23:43 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Отдельно сервис, отдельно воркер в другом процессе. Сборщик мусора раз в n времени прошёлся по запущенным воркерам и убил зависшие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 00:06 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Все сводится к смытию ? Но сколько не смывай, оно не тонет ... Так и будет висеть в памяти ... Надо: * для БД ставить таймауты * для файлов Эксель использовать нативные либы, выкидывающие исключения * проверять доступность файла и тд ... и писать код обрабатывающий исключения, который знает как восстанавливаться ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 00:18 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Сделать .Free у работающего TThread - работает. Жестокий путь. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 01:27 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Jonnik Есть функция которая запускается раз в пол часа. Она в свою очередь запускает до сотни других функций. В результате выполнения функция может упасть по разным причинам в одной из этих под функций. Например потерялась связь с сервером бд и еще куча непредвиденных причин. В результате процесс останавливается и не идет дальше. А по факту, если случилась непредвиденная ошибка и процесс остановился, то в случае бездействия в течении 10 мин функция должна завершиться и перезапуститься. Более правильный пример это когда открывается файл экселя, а он оказывается битым или заблокированным. И тут сам эксель выкидывает ошибку и процесс останавливается. В этом случае через 10 мин процесс должен завершиться и начаться заново для обработки других файлов. Можно в потоке проверять зависло или не зависло. Но я не знаю как завершить работу зависшей функции. А запускать эту функции в потоке не хочу, врятли она будет в нем адекватно работать, а переделать ее под поток займет много времени. Может есть вариант проще. А если зависнет та функция, которая запускает эти твои зависающие функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 01:55 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Jonnik Есть функция которая запускается раз в пол часа. Она в свою очередь запускает до сотни других функций. В результате выполнения функция может упасть по разным причинам в одной из этих под функций. Например потерялась связь с сервером бд и еще куча непредвиденных причин. В результате процесс останавливается и не идет дальше. А по факту, если случилась непредвиденная ошибка и процесс остановился, то в случае бездействия в течении 10 мин функция должна завершиться и перезапуститься. Более правильный пример это когда открывается файл экселя, а он оказывается битым или заблокированным. И тут сам эксель выкидывает ошибку и процесс останавливается. В этом случае через 10 мин процесс должен завершиться и начаться заново для обработки других файлов. Можно в потоке проверять зависло или не зависло. Но я не знаю как завершить работу зависшей функции. А запускать эту функции в потоке не хочу, врятли она будет в нем адекватно работать, а переделать ее под поток займет много времени. Может есть вариант проще. Не было у этого проекта нормального Архитектора (с) ЮЗ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 03:31 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 11:08 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Я ищю быстрый способ закрыть эту проблему. Советовать писать более правильный код это не совсем по делу. Не зная всей информации по задачи. За пару лет были устранены почти все возможные ошибки. Но остались такие, которые не связаны с моим кодом. И у меня нет желания тратить месяц на решение низкоуровневых ошибок. Бывают ошибки которые раз в пол года возникают. И ты еще попробуй их потом воссоздать потом, что бы исправить. В данной задаче проще выключить зависший процесс и запустить его заново. А именно в потоке проверять зависло или нет. И если зависло, то просто перезапустить приложение. Решается максимум за пару часов. Я думал есть более простой и элегантный способ. Все, всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 12:20 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Vlad F, Вон, видишь, народ вообще пришёл к выводу вместе с автором, что проще тихо похоронить всю функцию с результатом в доп.потоке, не разбирая причин. А ты на меня за невинные предложения наезжаешь ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 19:05 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Док Vlad F, Вон, видишь, народ вообще пришёл к выводу вместе с автором, что проще тихо похоронить всю функцию с результатом в доп.потоке, не разбирая причин. А ты на меня за невинные предложения наезжаешь ;) В доппроцессе, Док, в доппроцессе. И, прошу заметить, безо всякого Sinchronize(). От чего, впрочем, все эти новые предложения не становяться менее ректальными, имхо.)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 20:35 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Jonnik, если ты думаешь, что в потоке этого же приложения ты сможешь перезапустить задачу, то "Бывают ошибки которые раз в пол года возникают." может и не получиться, а может и получиться. Убивать только другим процессом. А если в твоем монстре много всего системного, то ОС может повиснуть раз в 3 года и тогда только кнопочкой Reset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 21:36 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Надо просто баги искать и править, а не херню выдумывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2020, 21:43 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
ъъъъъ Надо просто баги искать и править, а не херню выдумывать. Если бы это было всегда так просто... Когда структура программы изначально тщательно не продумана, а код пишется по принципу "вот так не сработало, сделаем иначе, может сработает", то искать потом в этом коде баги сродни наказанию Сизифу. Конечно можно предложить радикальное решение. Выбросить старый код на помойку и написать новый. Уже продуманный с учетом опыта (если конечно этот опыт хоть чему-то научил). Но если это реальный проект, то "где деньги, Зин?". P.S. Не могу сказать что сам в этом отношении безгрешен. Но принимать радикальные решения приходилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2020, 03:25 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
ъъъъъ Надо просто баги искать и править, а не херню выдумывать. Не все баги можно исправить - часть из них в продуктах, от которых у тебя нет исходников. Кроме этого, "шеф, опять катастрофа" на каждый баг - слишком дорогое удовольствие. Нужно уменьшать стоимость бага (то есть влияние проблемной ситуации на функционирование системы). По опыту доведения подобной задачи до безупречного состояния:
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2020, 17:48 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
softwarer Вся синхронизация - на объектах, обладающих таймаутом. Никаких "буду ждать до бесконечности пока что-то не случится" softwarer Если поток завис - по тайм-ауту отстрелить его через TerminateThread, по возможности почистить его ресурсы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2020, 19:11 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
YuRock Мда... Кстати, а как определить, что поток завис? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2020, 19:14 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис YuRock Мда... Кстати, а как определить, что поток завис? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2020, 19:21 |
|
||
|
Как прервать выполнения зависшей функции
|
|||
|---|---|---|---|
|
#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?all=1&fid=58&tid=2037935]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
194ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 570ms |

| 0 / 0 |
