Проблема в следующем.
Выполнение функции RunWait досрочно прерывается с кодом возврата -1, если запущена и завершена еще одна RunWait.
Может где-то ошибка в программе, но подозреваю что это глюк AutoIt. Надеюсь гуру форума помогут разобраться с проблемой.
Если нажать первую кнопку, а затем вторую, дождаться закрытия консольного окна второй кнопки, то сразу после этого RunWait первой кнопки завершает свою работу с кодом возврата -1.
Без таймера глюк не проявляется, т.к. событие нажатия второй кнопки не происходит, пока не отработает до конца вся цепочка события нажатия первой кнопки.
Выполнение функции RunWait досрочно прерывается с кодом возврата -1, если запущена и завершена еще одна RunWait.
Может где-то ошибка в программе, но подозреваю что это глюк AutoIt. Надеюсь гуру форума помогут разобраться с проблемой.
Код:
#Include-Once
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#Include <Timers.au3>
AutoItSetOption('MustDeclareVars', 1)
Global $hGUI = GUICreate('Testing CMD', 300, 100, Default, Default)
Global $btn1 = GUICtrlCreateButton('Run Cmd1', 40, 40, 90, 24)
Global $btn2 = GUICtrlCreateButton('Run Cmd2', 170, 40, 90, 24)
Global $Cmd1 = '"' & @COMSPEC & '" /v:on /c "@echo off & title Testing CMD1 & echo. & echo Testing CMD1 & echo ======================= & echo. & echo Normal return code - 35 & echo Autoexit from 30 sec... & echo. & set RET=35 & ping -n 30 localhost > nul & exit /b !RET!"'
Global $Cmd2 = '"' & @COMSPEC & '" /v:on /c "@echo off & title Testing CMD2 & echo. & echo Testing CMD2 & echo ======================= & echo. & echo Normal return code - 20 & echo Autoexit from 5 sec... & echo. & set RET=20 & ping -n 5 localhost > nul & exit /b !RET!"'
; MsgBox(64, 'Command info', 'Command cmd1:' & @LF & $Cmd1 & @LF & @LF & 'Command cmd2:' & @LF & $Cmd2)
Global $ret = 0, $msg = 0
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
GUIRegisterMsg($WM_TIMER, '_WM_TIMER')
Global $iTimer1 = _Timer_SetTimer($hGUI, 500)
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
GUIDelete()
Exit
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg
Local $nNotifyCode = BitShift($wParam, 16) ; Hi Word
Local $nID = BitAND($wParam, 0x0000FFFF) ; Low Word - PID
Local $hCtrl = $lParam
Switch $nID
Case 0
Case $btn1
$ret = RunWait($Cmd1, '', @SW_SHOW)
MsgBox(64, 'Info Button1 (ID=' & $nID & ')', 'Command Cmd1 completed' & @LF & @LF & 'Exit code ' & $ret, 0)
Case $btn2
$ret = RunWait($Cmd2, '', @SW_SHOW)
MsgBox(64, 'Info Button2 (ID=' & $nID & ')', 'Command Cmd2 completed' & @LF & @LF & 'Exit code ' & $ret, 3)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func _WM_TIMER($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $ilParam
Switch _Timer_GetTimerID($iwParam)
Case $iTimer1
; ...
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Если нажать первую кнопку, а затем вторую, дождаться закрытия консольного окна второй кнопки, то сразу после этого RunWait первой кнопки завершает свою работу с кодом возврата -1.
Без таймера глюк не проявляется, т.к. событие нажатия второй кнопки не происходит, пока не отработает до конца вся цепочка события нажатия первой кнопки.