ExecTimeout plug-in

From NSIS Wiki
Jump to navigationJump to search

Description

This is a simple plugin that will execute an application and wait for the process to exit, just like the ExecWait command. But in contrast to ExecWait you can specify a timeout. If the application does not exit before the timeout exceeds, the control will return to the installer. This can be used to make sure your installer won't stall, even if the application doesn't exit for some reason. You can either terminate the application on timeout or leave it alone.

ExecTimout vs. nsExec

Please note that the behavior of this plugin can not be achieved with the nsExec plugin and the /TIMEOUT switch. That's because nsExec will timeout only if the application doesn't write any output to stdout. Furthermore nsExec will reset it's timeout each time the application writes new output to stdout. Therefore nsExec can not make sure that the control will ever return to your installer. If the application continuously writes data to stadout, then the control won't return to your installer! With ExecTimeout you can make sure that the control will return to your installer as soon as the timeout exceeds. Also ExecTimeout will never reset it's timeout while the application is running.

This example shows the difference between ExecTimout and nsExec: ExecTimeout.Demo.zip (50 KB)

Usage

This is the syntax of ExecTimeout:

Usage:
  ${ExecTimeout} <Commandline> <Timeout> <Terminate> <Var ExitCode>

Arguments:
  <Commandline> should contain the path to the executable file [string]
  <Timeout> specifies the timeout in milliseconds [integer]
  <Terminate> specifies whether the process will be terminated on timeout [0|1]

Return Value:
  <ExitCode> will return the exit code of the application, "timeout" or "error"

Includes

Include this in your script to use the ExecTimeout plugin:

!macro ExecTimeout commandline timeout_ms terminate var_exitcode
  Timeout::ExecTimeout '${commandline}' '${timeout_ms}' '${terminate}'
  Pop ${var_exitcode}
!macroend
 
!define ExecTimeout "!insertmacro ExecTimeout"

Example

Here is a simple example of how to use ExecTimeout:

Name "TestTimeout"
OutFile "TestTimeout.exe"
 
Section
  MessageBox MB_ICONINFORMATION "I will start Notepad now. It will time out after 5 seconds!"
  DetailPrint 'Executing: "$WINDIR\Notepad.exe"'
 
  ${ExecTimeout} '"$WINDIR\Notepad.exe"' 5000 1 $0
 
  DetailPrint "Exit Code: $0"
SectionEnd

Download