Maza_Faka 07:22 22-12-2008
Цитата:
Неплохо . Я кстати тоже об этом думал, но почему то казалось что оно будет сильно тормозить скрипт... И ещё кстати, в справке написано кое-что по этому поводу:
http://www.autoitscript.com/autoit3/docs/functions/GUIRegisterMsg.htm
Цитата:
Так что если в Test2() будет нечто блокирующее (типа ещё одного цикла), то могут быть непредсказуемые последствия .
Я бы ещё в твоём примере завершал цикл в первой функции, он конечно и так приостанавливается на время выполнения второй, но всё же продолжает после её завершения...
Код: #include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <MenuConstants.au3>
;
Opt("GUIOnEventMode", 1)
Global $iEndFunction = False
$hGUI = GUICreate("OnEvent Interloper Functions", 180, 100)
$Button1 = GUICtrlCreateButton("B1", 50, 50, 70, 20)
GUICtrlSetOnEvent(-1, "Test1")
$Button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20)
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState()
While 1
Sleep(100)
WEnd
;Отслеживаем уведомление SC_CLOSE (пользователь закрыл окно)
Func WM_SYSCOMMAND($hWmd, $Msg, $wParam, $lParam)
If $wParam = $SC_CLOSE Then _Exit()
Return $GUI_RUNDEFMSG
EndFunc
;Отслеживаем уведомление от кнопки
Func WM_COMMAND($hWmd, $Msg, $wParam, $lParam)
Local $nID = BitAND($wParam, 0x0000FFFF)
Local $nCode = BitShift($wParam, 16)
Switch $nCode
Case $BN_CLICKED
Switch $nID
Case $Button2
$iEndFunction = True
Test2()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func Test1()
TrayTip("", "", 1)
$iEndFunction = False
Local $iCounter = 1
While 1
Sleep(10)
ConsoleWrite("Loop1 in process... " & $iCounter & @CRLF)
$iCounter += 1
If $iEndFunction Then ExitLoop
WEnd
EndFunc
Func Test2()
TrayTip("Test", "Test", 1)
EndFunc
Func _Exit()
Exit
EndFunc
Цитата:
Мой вариант
Неплохо . Я кстати тоже об этом думал, но почему то казалось что оно будет сильно тормозить скрипт... И ещё кстати, в справке написано кое-что по этому поводу:
http://www.autoitscript.com/autoit3/docs/functions/GUIRegisterMsg.htm
Цитата:
Warning: blocking of running user functions which executes window messages with commands such as "Msgbox()" can lead to unexpected behavior, the return to the system should be as fast as possible !!!
Так что если в Test2() будет нечто блокирующее (типа ещё одного цикла), то могут быть непредсказуемые последствия .
Я бы ещё в твоём примере завершал цикл в первой функции, он конечно и так приостанавливается на время выполнения второй, но всё же продолжает после её завершения...
Код: #include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <MenuConstants.au3>
;
Opt("GUIOnEventMode", 1)
Global $iEndFunction = False
$hGUI = GUICreate("OnEvent Interloper Functions", 180, 100)
$Button1 = GUICtrlCreateButton("B1", 50, 50, 70, 20)
GUICtrlSetOnEvent(-1, "Test1")
$Button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20)
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState()
While 1
Sleep(100)
WEnd
;Отслеживаем уведомление SC_CLOSE (пользователь закрыл окно)
Func WM_SYSCOMMAND($hWmd, $Msg, $wParam, $lParam)
If $wParam = $SC_CLOSE Then _Exit()
Return $GUI_RUNDEFMSG
EndFunc
;Отслеживаем уведомление от кнопки
Func WM_COMMAND($hWmd, $Msg, $wParam, $lParam)
Local $nID = BitAND($wParam, 0x0000FFFF)
Local $nCode = BitShift($wParam, 16)
Switch $nCode
Case $BN_CLICKED
Switch $nID
Case $Button2
$iEndFunction = True
Test2()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func Test1()
TrayTip("", "", 1)
$iEndFunction = False
Local $iCounter = 1
While 1
Sleep(10)
ConsoleWrite("Loop1 in process... " & $iCounter & @CRLF)
$iCounter += 1
If $iEndFunction Then ExitLoop
WEnd
EndFunc
Func Test2()
TrayTip("Test", "Test", 1)
EndFunc
Func _Exit()
Exit
EndFunc