Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как прервать выполнения зависшей функции  [new]
Jonnik
Member

Откуда:
Сообщений: 168
Есть функция которая запускается раз в пол часа.
Она в свою очередь запускает до сотни других функций.

В результате выполнения функция может упасть по разным причинам в одной из этих под функций. Например потерялась связь с сервером бд и еще куча непредвиденных причин. В результате процесс останавливается и не идет дальше. А по факту, если случилась непредвиденная ошибка и процесс остановился, то в случае бездействия в течении 10 мин функция должна завершиться и перезапуститься.

Более правильный пример это когда открывается файл экселя, а он оказывается битым или заблокированным. И тут сам эксель выкидывает ошибку и процесс останавливается. В этом случае через 10 мин процесс должен завершиться и начаться заново для обработки других файлов.

Можно в потоке проверять зависло или не зависло. Но я не знаю как завершить работу зависшей функции. А запускать эту функции в потоке не хочу, врятли она будет в нем адекватно работать, а переделать ее под поток займет много времени.
Может есть вариант проще.
22 май 20, 22:24    [22137972]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 759
искать заведомо кривой костыль для подпирания такого же заведомо кривого кода...отличный вариант.
22 май 20, 22:27    [22137973]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Док
Member

Откуда: Казань
Сообщений: 6670
Jonnik
переделать ее под поток займет много времени.

Не так уж и много. Если сделать ее выполнение через synchronize/queue, то она должна выполняться в контексте основного потока. Там ее можно будет обернуть в многочисленные try..except/try..finally, понаставить флажков ... вообщем, для велосипедостроения куча возможностей :)
22 май 20, 22:35    [22137980]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Jonnik
Member

Откуда:
Сообщений: 168
Док
Jonnik
переделать ее под поток займет много времени.

Не так уж и много. Если сделать ее выполнение через synchronize/queue, то она должна выполняться в контексте основного потока. Там ее можно будет обернуть в многочисленные try..except/try..finally, понаставить флажков ... вообщем, для велосипедостроения куча возможностей :)


Там 30 000 строк. Я не уверен, что это будет так уже быстро ее адаптировать для потока.
Поэтому и спрашиваю. Может есть другой способ.
22 май 20, 22:56    [22137988]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Vlad F
Member

Откуда:
Сообщений: 1281
Док,

Per anus ad astra.))
Зачем ему в таком случае поток вообще?))
22 май 20, 23:00    [22137990]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50050

Jonnik
Например потерялась связь с сервером бд и еще куча непредвиденных причин. В результате
процесс останавливается и не идет дальше.

В этот момент к нему удобно подключиться отладчиком, посмотреть на эту непредвиденную
причину и сделать её предвиденной, не вызывающей зависание. Повторять до полного упокоения
непредвиденных причин.

Posted via ActualForum NNTP Server 1.5

22 май 20, 23:05    [22137991]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Док
Member

Откуда: Казань
Сообщений: 6670
Jonnik
Там 30 000 строк. Я не уверен, что это будет так уже быстро ее адаптировать для потока.
Поэтому и спрашиваю. Может есть другой способ.

если функция останавливает основной поток, то 1) либо внутри функции нужно предусматривать выход из нее по наступлении определенных условий, 2) либо делать ее в потоке. Но и там в потоке придется делать п.1

Vlad F
Зачем ему в таком случае поток вообще?))

ты у меня спрашиваешь? Я предположил, что это не так сложно, пока не узнал про 30К строк кода :)

Vlad F
Per anus ad astra.))

а вот удивительно, но в жизни делание некоторых вещей per anus - самый оптимальный вариант
22 май 20, 23:12    [22137993]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Vlad F
Member

Откуда:
Сообщений: 1281
Док,

1) У тебя, потому что это ты ему такие советы советуешь.))
2) Ещё раз, - зачем тогда ему этот фейковый поток вообще, если его потом предлагается проецировать на основной и отслеживаться уже в нем? Пусть тогда сразу в основном и отлаживается.
22 май 20, 23:29    [22138002]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Jonnik
Member

Откуда:
Сообщений: 168
Dimitry Sibiryakov

Jonnik
Например потерялась связь с сервером бд и еще куча непредвиденных причин. В результате
процесс останавливается и не идет дальше.

В этот момент к нему удобно подключиться отладчиком, посмотреть на эту непредвиденную
причину и сделать её предвиденной, не вызывающей зависание. Повторять до полного упокоения
непредвиденных причин.


Это не совсем вариант так как есть ошибки самих компонентов, которые происходят редко.
Например закончились ресурсы GDI. У меня нет желания решать вопрос почему на каком-то этапе прорисовки окна с DevExpress в редких случаях вылетает такая ошибка и все останавливается.
Или почему эксель может вылететь 10 способами. (Это хоть можно предусматреть)

Но проще убить этот процесс и начать заново.
22 май 20, 23:43    [22138007]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2311
Отдельно сервис, отдельно воркер в другом процессе. Сборщик мусора раз в n времени прошёлся по запущенным воркерам и убил зависшие
23 май 20, 00:06    [22138013]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9845
Все сводится к смытию ? Но сколько не смывай, оно не тонет ... Так и будет висеть в памяти ...

Надо:
* для БД ставить таймауты
* для файлов Эксель использовать нативные либы, выкидывающие исключения
* проверять доступность файла
и тд

... и писать код обрабатывающий исключения, который знает как восстанавливаться ...
23 май 20, 00:18    [22138021]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
rgreat
Member

Откуда:
Сообщений: 5978
Сделать .Free у работающего TThread - работает.

Жестокий путь. ;)
23 май 20, 01:27    [22138045]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
ъъъъъ
Member

Откуда:
Сообщений: 701
Jonnik
Есть функция которая запускается раз в пол часа.
Она в свою очередь запускает до сотни других функций.

В результате выполнения функция может упасть по разным причинам в одной из этих под функций. Например потерялась связь с сервером бд и еще куча непредвиденных причин. В результате процесс останавливается и не идет дальше. А по факту, если случилась непредвиденная ошибка и процесс остановился, то в случае бездействия в течении 10 мин функция должна завершиться и перезапуститься.

Более правильный пример это когда открывается файл экселя, а он оказывается битым или заблокированным. И тут сам эксель выкидывает ошибку и процесс останавливается. В этом случае через 10 мин процесс должен завершиться и начаться заново для обработки других файлов.

Можно в потоке проверять зависло или не зависло. Но я не знаю как завершить работу зависшей функции. А запускать эту функции в потоке не хочу, врятли она будет в нем адекватно работать, а переделать ее под поток займет много времени.
Может есть вариант проще.


А если зависнет та функция, которая запускает эти твои зависающие функции?
23 май 20, 01:55    [22138048]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
northener
Member

Откуда: Москва
Сообщений: 75
Jonnik
Есть функция которая запускается раз в пол часа.
Она в свою очередь запускает до сотни других функций.

В результате выполнения функция может упасть по разным причинам в одной из этих под функций. Например потерялась связь с сервером бд и еще куча непредвиденных причин. В результате процесс останавливается и не идет дальше. А по факту, если случилась непредвиденная ошибка и процесс остановился, то в случае бездействия в течении 10 мин функция должна завершиться и перезапуститься.

Более правильный пример это когда открывается файл экселя, а он оказывается битым или заблокированным. И тут сам эксель выкидывает ошибку и процесс останавливается. В этом случае через 10 мин процесс должен завершиться и начаться заново для обработки других файлов.

Можно в потоке проверять зависло или не зависло. Но я не знаю как завершить работу зависшей функции. А запускать эту функции в потоке не хочу, врятли она будет в нем адекватно работать, а переделать ее под поток займет много времени.
Может есть вариант проще.


Не было у этого проекта нормального Архитектора (с) ЮЗ
23 май 20, 03:31    [22138057]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
x1ca4064
Member

Откуда:
Сообщений: 1099
Jonnik

Может есть вариант проще.


Есть, но жуткий 22040439, лучше в отдельном процессе
23 май 20, 11:08    [22138080]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Jonnik
Member

Откуда:
Сообщений: 168
Я ищю быстрый способ закрыть эту проблему.
Советовать писать более правильный код это не совсем по делу. Не зная всей информации по задачи. За пару лет были устранены почти все возможные ошибки. Но остались такие, которые не связаны с моим кодом. И у меня нет желания тратить месяц на решение низкоуровневых ошибок. Бывают ошибки которые раз в пол года возникают. И ты еще попробуй их потом воссоздать потом, что бы исправить.
В данной задаче проще выключить зависший процесс и запустить его заново.
А именно в потоке проверять зависло или нет. И если зависло, то просто перезапустить приложение.
Решается максимум за пару часов.
Я думал есть более простой и элегантный способ.

Все, всем спасибо.
23 май 20, 12:20    [22138097]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Док
Member

Откуда: Казань
Сообщений: 6670
Vlad F,

Вон, видишь, народ вообще пришёл к выводу вместе с автором, что проще тихо похоронить всю функцию с результатом в доп.потоке, не разбирая причин. А ты на меня за невинные предложения наезжаешь ;)
23 май 20, 19:05    [22138282]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
Vlad F
Member

Откуда:
Сообщений: 1281
Док
Vlad F,

Вон, видишь, народ вообще пришёл к выводу вместе с автором, что проще тихо похоронить всю функцию с результатом в доп.потоке, не разбирая причин. А ты на меня за невинные предложения наезжаешь ;)

В доппроцессе, Док, в доппроцессе. И, прошу заметить, безо всякого Sinchronize().
От чего, впрочем, все эти новые предложения не становяться менее ректальными, имхо.))
23 май 20, 20:35    [22138316]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
cptngrb
Member

Откуда:
Сообщений: 558
Jonnik, если ты думаешь, что в потоке этого же приложения ты сможешь перезапустить задачу, то "Бывают ошибки которые раз в пол года возникают." может и не получиться, а может и получиться. Убивать только другим процессом. А если в твоем монстре много всего системного, то ОС может повиснуть раз в 3 года и тогда только кнопочкой Reset
23 май 20, 21:36    [22138338]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
ъъъъъ
Member

Откуда:
Сообщений: 701
Надо просто баги искать и править, а не херню выдумывать.
23 май 20, 21:43    [22138344]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать выполнения зависшей функции  [new]
northener
Member

Откуда: Москва
Сообщений: 75
ъъъъъ
Надо просто баги искать и править, а не херню выдумывать.

Если бы это было всегда так просто...
Когда структура программы изначально тщательно не продумана, а код пишется по принципу "вот так не сработало, сделаем иначе, может сработает", то искать потом в этом коде баги сродни наказанию Сизифу.

Конечно можно предложить радикальное решение. Выбросить старый код на помойку и написать новый. Уже продуманный с учетом опыта (если конечно этот опыт хоть чему-то научил). Но если это реальный проект, то "где деньги, Зин?".

P.S. Не могу сказать что сам в этом отношении безгрешен. Но принимать радикальные решения приходилось.

Сообщение было отредактировано: 24 май 20, 03:30
24 май 20, 03:25    [22138411]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить