Mutex.InterProcessTimeout

From SunFlurry wiki
Jump to: navigation, search
  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");