Difference between revisions of "Mutex.InterProcessTimeout"
1>Admin |
m (1 revision imported) |
(No difference)
|
Latest revision as of 11:38, 18 November 2022
InterProcessTimeout (Работа с подчиненными процессами) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция включает сторожевого пса для контроля зависания подчиненного процесса. Процесс будет считаться неработоспособным, если за указанное время основной поток исполнения ни разу не ответил на запрос о состоянии (основной поток создает такие ответы после исполнения каждой команды, а также в моменты бездействия). Для мониторинга жизнедеятельности подчиненного процесса, основной процесс использует следующие инструменты:
- Периодически проверяет, существует ли все еще подчиненный процесс в системе.
- Мониторит здоровье потока межпроцессового обмена (потока IPR). Если данный поток в клиенте долгое время не отвечает, процесс считается неработоспособным.
- При установке тайм-аута в данной функции, также будет мониториться здоровье основного исполняемого потока процесса. Если поток не отвечает дольше указанного тайм-аута миллисекунд, процесс считается неработоспособным. Чтобы отключить тайм-аут, достаточно передать функции значение 0. Если требуется изменить тайм-аут в процессе работы или отключить его, можно использовать функцию InterProcessServerTimeout, которая вызывается на стороне подчиненного процесса. К примеру, до выполнения длительной внешней операции, тайм-аут можно увеличить до достаточно большого значения, или отключить совсем, а после операции вернуть его предыдущее значение.
Для контроля других исполняемых потоков (кроме основного) подчиненного процесса, разработчик должен создать свои механизмы защиты (к примеру, воспользоваться сторожевым псом).
Синтаксис
Mutex.InterProcessTimeout(<Тайм-аут в мс.>):<Предыдущий тайм-аут в мс. (INT)>
Аргументы
<Тайм-аут в мс.>
- (необязательный аргумент) Тайм-аут основного исполняемого потока в миллисекундах. Чтобы нарушить этот таймаут, единственная команда в основном потоке должна выполняться дольше, чем, заданное число миллисекунд. Фактический тайм-аут исполнения команды может быть несколько больше заданного (до 100 мс. разницы). Для отключения тайм-аута, необходимо использовать значение аргумента 0. Если аргумент не задан, тайм-аут не будет изменен.
Возвращаемое значение
Возвращает предыдущее значение тайм-аута.
Примеры
//Пример демонстрирует работу тайм-аута при исполнении подчиненного процесса. Function ОбычныйСон(Длина) Sleep(Длина); EndFunction Function СистемныйСон(Длина) aKernel32:=Lib.Load("Kernel32.dll"); aKernel32.RegisterFunction("Sleep","stdcall","UI32"); aKernel32.Sleep(Длина); EndFunction аПроцесс:=Mutex.InitializeSeparateProcess(); //Установим тайм-аут равным 2 секунды аПроцесс.InterProcessTimeout(2000); //Будет выведено "Шаг 1" Message("Шаг 1"); //Будет выведено "Шаг 2" //Несмотря на то, что Sleep ожидает больше 2 секунд, это внутреннее ожидание, которое периодически обновляет тайм-аут аПроцесс.InterProcessExecuteFunction("ОбычныйСон",3000); Message("Шаг 2"); //"Шаг 3" выведен не будет. Через 2 секунды после начала исполнения, функция InterProcessExecuteFunction создаст исключение из-за // того, что подчиненный процесс "завис" во время исполнения. аПроцесс.InterProcessExecuteFunction("СистемныйСон",3000); Message("Шаг 3");