Закрыть поток по таймауту

Elm

Client
Регистрация
10.06.2016
Сообщения
9
Благодарностей
0
Баллы
1
Такая ситуация: шаблон иногда подвисает из-за некорректной обработки какого-нибудь события и так и стоит на нем несколько часов.

Как сделать так, чтобы по истечении какого-то промежутка времени зависший инстанс перегружался, или чтобы сам поток завершался с сообщение о неуспешном выполнии?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
зависит от логики. если есть зацикливание, внутрь его можно поместить проверочный блок, который сравнивает дату старта проекта и текущую. Если их разница превышает какой-то заданный временной промежуток - шаблон завершается
 
  • Спасибо
Реакции: Elm

Elm

Client
Регистрация
10.06.2016
Сообщения
9
Благодарностей
0
Баллы
1
зависит от логики. если есть зацикливание, внутрь его можно поместить проверочный блок, который сравнивает дату старта проекта и текущую. Если их разница превышает какой-то заданный временной промежуток - шаблон завершается
нет зацикливания там
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
за счет чего тогда происходит зависание?
 

Elm

Client
Регистрация
10.06.2016
Сообщения
9
Благодарностей
0
Баллы
1
там реально несколько причин есть, да еще и новые вылазят со временем, шаблон сложный
поэтому хочу просто убивать поток по таймату

можно выствить что-то типа таймаута на жизнь потока, в самом шабе или в настройках?
например поставлю 30-40 минут и этого уже должно хватить, чтобы убить поток, который 9 часов тупо провисел
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
обещают ввести. на данный момент такой возможности нет.
возможно можно доставать идентификатор потока и писать его куда-то в текстовик вместе со временем начала. А другим шаблоном мониторить этот текстовик, сверять даты, килять поток, если такой функционал предусмотрен. Нужно искать здесь https://help.zennolab.com/en/v5/zennoposter/5.8/webframe.html#ZennoLab.CommandCenter.html
 
  • Спасибо
Реакции: Elm

Elm

Client
Регистрация
10.06.2016
Сообщения
9
Благодарностей
0
Баллы
1
обещают ввести. на данный момент такой возможности нет.
возможно можно доставать идентификатор потока и писать его куда-то в текстовик вместе со временем начала. А другим шаблоном мониторить этот текстовик, сверять даты, килять поток, если такой функционал предусмотрен. Нужно искать здесь https://help.zennolab.com/en/v5/zennoposter/5.8/webframe.html#ZennoLab.CommandCenter.html
это, конечно, мощно, но с таймером наверное проще реализовать будет
 

workoles

Client
Регистрация
02.05.2015
Сообщения
276
Благодарностей
81
Баллы
28
Есть два варианта решения:
1. Сложный, но делается число в шаблоне. Берешь в зенке переменную окружения {-Environment.TickCount-}. Если мне не изменяет память, то это системная переменная которая отсчитывает время с момента запуска системы. это время в милисекундах. соответственно алгоритм:
- при старте работы шаба запоминаешь это время
- напихиваешь в шаблон кубики которые в разные моменты времени опять берут эту переменную и сравниваешь текущее время со временем старта. соответственно если оно больше заданного - то завершаешь работу шаба, если меньше, то продолжает работу.
у этого способа есть свои минусы, но решить твою проблему хоть как-то поможет.

2. Делаешь на уровне системы. Как правило если шаб зависает, то чем дольше он висит, тем больше оперативы ему нужно. В общем делаешь батник который грохает процессы, которые едят оперативки больше заданного объема. Добавляешь этот батник в загрузку по расписанию, и винда запускает его хоть каждую минуту (как тебе нужно), и, если находит процесс base.exe, то принудительно его грохает.
Я пользуюсь вот таким скриптом. Занятость оперативы устанавливаешь сам, сейчас стоит 417200000 байт.

Код:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _
    "Select * From Win32_Process " _
    & "Where Name = 'base.exe'")

Killed = False
For Each objProcess In colProcesses
  If objProcess.WorkingSetSize > 417200000 Then
    objProcess.Terminate
    Killed = True
  End If
Next

If Killed Then
  Set objShell = Wscript.CreateObject("Wscript.Shell")
  objShell.Run "notepad.exe"
End If
Вот как то так. Для себя я пока нашел только эти способы, если есть что-то еще, буду сам рад узнать
 
  • Спасибо
Реакции: sw_sw и Elm

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)