Difference between revisions of "Mutex.InterProcessTimeout"
m (1 revision imported) |
1>Admin |
||
Line 16: | Line 16: | ||
* Периодически проверяет, существует ли все еще подчиненный процесс в системе. | * Периодически проверяет, существует ли все еще подчиненный процесс в системе. | ||
* Мониторит здоровье потока межпроцессового обмена (потока IPR). Если данный поток в клиенте долгое время не отвечает, процесс считается неработоспособным. | * Мониторит здоровье потока межпроцессового обмена (потока IPR). Если данный поток в клиенте долгое время не отвечает, процесс считается неработоспособным. | ||
− | * При установке тайм-аута в данной функции, также будет мониториться здоровье основного исполняемого потока процесса. Если поток не отвечает дольше указанного тайм-аута миллисекунд, процесс считается неработоспособным. Чтобы отключить тайм-аут, достаточно передать функции значение 0. | + | * При установке тайм-аута в данной функции, также будет мониториться здоровье основного исполняемого потока процесса. Если поток не отвечает дольше указанного тайм-аута миллисекунд, процесс считается неработоспособным. Чтобы отключить тайм-аут, достаточно передать функции значение 0. Если требуется изменить тайм-аут в процессе работы или отключить его, можно использовать функцию [[InterProcessServerTimeout]], которая вызывается на стороне подчиненного процесса. К примеру, до выполнения длительной внешней операции, тайм-аут можно увеличить до достаточно большого значения, или отключить совсем, а после операции вернуть его предыдущее значение. |
Для контроля других исполняемых потоков (кроме основного) подчиненного процесса, разработчик должен создать свои механизмы защиты (к примеру, воспользоваться [[Функции общего назначения#Объект сторожевого пса|сторожевым псом]]). | Для контроля других исполняемых потоков (кроме основного) подчиненного процесса, разработчик должен создать свои механизмы защиты (к примеру, воспользоваться [[Функции общего назначения#Объект сторожевого пса|сторожевым псом]]). | ||
Line 52: | Line 52: | ||
//Будет выведено "Шаг 2" | //Будет выведено "Шаг 2" | ||
− | // | + | //Несмотря на то, что Sleep ожидает больше 2 секунд, это внутреннее ожидание, которое периодически обновляет тайм-аут |
аПроцесс.InterProcessExecuteFunction("ОбычныйСон",3000); | аПроцесс.InterProcessExecuteFunction("ОбычныйСон",3000); | ||
Message("Шаг 2"); | Message("Шаг 2"); |
Revision as of 08:27, 14 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");