Вот как я представляю работу режима GUIOnEventMode:
Сначала этот режим казался загадочным с каким то внутренним движком, непонятно было лучше он или хуже. Переделывал программы на этот режим OnEvent, но в итоге понял, что это в принципе алгоритм также требует сравнение событий с идентификаторами, только способ вызова сделан внутри.
Из описание режима OnEvent было ясно что это не отдельный процесс, а аналогичный вызову AdlibRegister, который прерывает выполнение скрипта, чтобы обработать проверку сообщений. Как видно из примера создаётся двумерный массив, который связывает функцию с событием, а с помощью AdlibRegister вызывает проверку событий в цикле.
Код:
#include <GUIConstantsEx.au3>
$GUIOnEventMode = True
Local $aEvent[1][2] = [[0]]
_Opt($GUIOnEventMode)
$hGui = GUICreate('My Program', 250, 260)
_GUICtrlSetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$iBtn1 = GUICtrlCreateButton('Start', 10, 10, 120, 22)
_GUICtrlSetOnEvent($iBtn1, "_Button1")
$iBtn2 = GUICtrlCreateButton('End', 10, 40, 120, 22)
_GUICtrlSetOnEvent($iBtn2, "_Button2")
GUISetState()
While 1
Sleep(100000)
WEnd
Func _Opt($GUIOnEventMode = 0)
If $GUIOnEventMode Then
AdlibRegister('_While', 20)
Else
AdlibUnRegister("_While")
EndIf
EndFunc ;==>_Opt
Func _While()
Local $msg = GUIGetMsg()
For $i = 1 To $aEvent[0][0]
If $msg = $aEvent[$i][0] Then
AdlibUnRegister("_While")
Call($aEvent[$i][1])
AdlibRegister('_While', 10)
ExitLoop
EndIf
Next
EndFunc ;==>_While
Func _GUICtrlSetOnEvent($iControl_ID, $sFuncName)
ReDim $aEvent[$aEvent[0][0] + 2][2]
$aEvent[0][0] += 1
$aEvent[$aEvent[0][0]][0] = $iControl_ID
$aEvent[$aEvent[0][0]][1] = $sFuncName
EndFunc ;==>_GUICtrlSetOnEvent
Func _Button1()
MsgBox(0, 'Сообщение', 'Кнопка Start')
EndFunc ;==>_Button1
Func _Button2()
MsgBox(0, 'Сообщение', 'Кнопка End')
EndFunc ;==>_Button2
Func _Exit()
Exit
EndFunc ;==>_Exit
Сначала этот режим казался загадочным с каким то внутренним движком, непонятно было лучше он или хуже. Переделывал программы на этот режим OnEvent, но в итоге понял, что это в принципе алгоритм также требует сравнение событий с идентификаторами, только способ вызова сделан внутри.
Из описание режима OnEvent было ясно что это не отдельный процесс, а аналогичный вызову AdlibRegister, который прерывает выполнение скрипта, чтобы обработать проверку сообщений. Как видно из примера создаётся двумерный массив, который связывает функцию с событием, а с помощью AdlibRegister вызывает проверку событий в цикле.