Mutex.InterProcessTimeout
| InterProcessTimeout (Работа с подчиненными процессами) | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||
Функция включает сторожевого пса для контроля зависания подчиненного процесса. Процесс будет считаться неработоспособным, если за указанное время основной поток исполнения ни разу не ответил на запрос о состоянии (основной поток создает такие ответы после исполнения каждой команды, а также в моменты бездействия). Для мониторинга жизнедеятельности подчиненного процесса, основной процесс использует следующие инструменты:
- Периодически проверяет, существует ли все еще подчиненный процесс в системе.
- Мониторит здоровье потока межпроцессового обмена (потока IPR). Если данный поток в клиенте долгое время не отвечает, процесс считается неработоспособным.
- При установке тайм-аута в данной функции, также будет мониториться здоровье основного исполняемого потока процесса. Если поток не отвечает дольше указанного тайм-аута миллисекунд, процесс считается неработоспособным. Чтобы отключить тайм-аут, достаточно передать функции значение 0.
Для контроля других исполняемых потоков (кроме основного) подчиненного процесса, разработчик должен создать свои механизмы защиты (к примеру, воспользоваться сторожевым псом).
Синтаксис
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");