骗子 发表于 2011-4-5 12:29:20

关于GUI按钮产生的循环如何有效的退出

三个按钮,前两个都指向一个无限循环的子程序(我是这么理解的),第三个做为停止键。
但是实现过程中发现如果子程序的循环时间很短的话停止键比较有效,循环时间如果比较长的话想用停止按钮停止循环就又点困难了,得不停的点好多次才行
有没有办法解决这个问题


#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
;~ #NoTrayIcon
Local $Flg=False
HotKeySet("{ESC}", "Terminate")
HotKeySet('{F9}', '_HIShow')
Dim $H = True
Local $GUI_Button_1, $GUI_Button_2, $GUI_Button_stop, $GUIActiveX,$oIE
_IEErrorHandlerRegister()
$oIE = _IECreateEmbedded()
GUICreate("test。 F9键隐藏/显示窗口,ESC键退出", 300, 300, @DesktopWidth /2, @DesktopHeight /2)
$GUIActiveX = GUICtrlCreateObj($oIE, -1, 100, 300, 200)
       
       
       
$GUI_Button_1 = GUICtrlCreateButton("循环1,延时1秒,不停的按停止键才能推出循环", 5, 5, 290, 25)
$GUI_Button_2 = GUICtrlCreateButton("循环2,循环一圈很快,按一次停止键就能退出", 5, 30, 290, 25)
$GUI_Button_stop = GUICtrlCreateButton("停止键,狂点才能停", 5, 60, 290, 25)
       

$oIE.navigate("www.baidu.com")
GUISetState()

While 1
        $msg = GUIGetMsg()
        Select
                Case $msg = $GUI_EVENT_CLOSE
                        Exit
                Case $msg = $GUI_Button_1
                        _xunhuan1()
                Case $msg = $GUI_Button_2
                        _xunhuan2()
                Case $msg = $GUI_Button_stop
                        Exit
        EndSelect
WEnd


Func _xunhuan1()
        While 1
                $msg = GUIGetMsg()
                                If $msg = $GUI_Button_stop Then ExitLoop
                $oIE.navigate("www.baidu.com")
                Sleep (1000);加了延时
        WEnd
        MsgBox(0,"","循环1被停止了")
EndFunc   

Func _xunhuan2()
        While 1
        $msg = GUIGetMsg()
        If $msg = $GUI_Button_stop Then ExitLoop
        $oIE.navigate("www.163.com") ;循环时间很短,按停止键后可以直接停止
        WEnd
        MsgBox(0,"","循环2被停止了")
EndFunc   




Func _HIShow()
        If $H = True Then
                GUISetState(@SW_HIDE)
                $H = False
        Else
                GUISetState(@SW_SHOW)
                $H = True
        EndIf
EndFunc   ;==>_HIShow
Func Terminate()
        Exit 0
EndFunc   ;==>Terminate

CCTRV 发表于 2011-4-5 13:51:26

做成多进程就可以了...
Autoit是一个单线程语言,不能够在循环中随意中断的.

xyold1 发表于 2011-4-5 14:36:31

OnEvent模式能解决你的问题吧

小A 发表于 2011-4-5 14:40:22

用注册windows消息模式应该可以解决这个问题

netegg 发表于 2011-4-5 15:34:36

如果是操作对象,不好办,需要对象响应并返回值

xyold1 发表于 2011-4-6 21:07:51

在onevent 模式下可以注册系统级的消息,程序会优先响应,例如,加入下面代码,程序进入死循环或正在运算时,也能响应最大小化和关闭,我对系统消息还不太了解,不知如何为按钮注册一个系统消息。
GUIRegisterMsg($WM_SYSCOMMAND, "On_WM_SYSCOMMAND")
Func On_WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
        Local Const $SC_MOVE = 0xF010
        Local Const $SC_SIZE = 0xF000
        Local Const $SC_CLOSE = 0xF060

        If $hWnd = $Form1 Then
                ; ConsoleWrite(BitAND($wParam, 0xFFF0) & @crlf)
                ; 61472 Minimize
                ; 61488 Maximize
                ; 61728 Revoke Maximize or Minize (Restore)

                Switch BitAND($wParam, 0xFFF0)
                        Case 61472

                        Case 61488
;~                                 ConsoleWrite("Maximize detected" & @CRLF)
                        Case 61728

                        Case $SC_MOVE

                        Case $SC_SIZE
;~                                 ConsoleWrite("WM_Size detected" & @CRLF)
                        Case $SC_CLOSE

                                Exit
                                ; Return -1 ; to intercept close
                EndSwitch
        EndIf

        Return $GUI_RUNDEFMSG
EndFunc   ;==>On_WM_SYSCOMMAND

3mile 发表于 2011-4-6 23:12:28

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
;~ #NoTrayIcon
Global $Flg=True
;~ HotKeySet("{ESC}", "Terminate")
;~ HotKeySet('{F9}', '_HIShow')
Dim $H = True
Local $GUI_Button_1, $GUI_Button_2, $GUI_Button_stop, $GUIActiveX,$oIE
_IEErrorHandlerRegister()
$oIE = _IECreateEmbedded()
GUICreate("test。 F9键隐藏/显示窗口,ESC键退出", 300, 300, @DesktopWidth /2, @DesktopHeight /2)
$GUIActiveX = GUICtrlCreateObj($oIE, -1, 100, 300, 200)
      
      
      
$GUI_Button_1 = GUICtrlCreateButton("循环1,延时1秒,不停的按停止键才能推出循环", 5, 5, 290, 25)
$GUI_Button_2 = GUICtrlCreateButton("循环2,循环一圈很快,按一次停止键就能退出", 5, 30, 290, 25)
$GUI_Button_stop = GUICtrlCreateButton("停止键,狂点才能停", 5, 60, 290, 25)
      

$oIE.navigate("www.baidu.com")
GUISetState()
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
While 1
      $msg = GUIGetMsg()
      Select
                Case $msg = $GUI_EVENT_CLOSE
                        Exit
                Case $msg = $GUI_Button_1
                        _xunhuan1()
                Case $msg = $GUI_Button_2
                        _xunhuan2()
;~               Case $msg = $GUI_Button_stop
;~                         Exit
      EndSelect
WEnd


Func _xunhuan1()
        if $Flg=False then $Flg=True
        GUICtrlSetState($GUI_Button_1,$gui_disable)
        GUICtrlSetState($GUI_Button_2,$gui_disable)
      While $Flg
                $oIE.navigate("www.baidu.com")
                Sleep (1000);加了延时
      WEnd
      MsgBox(0,"","循环1被停止了")
                GUICtrlSetState($GUI_Button_1,$gui_enable)
                GUICtrlSetState($GUI_Button_2,$gui_enable)
EndFunc   

Func _xunhuan2()
        if $Flg=False then $Flg=True
        GUICtrlSetState($GUI_Button_1,$gui_disable)
        GUICtrlSetState($GUI_Button_2,$gui_disable)
      While $Flg
      $oIE.navigate("www.163.com") ;循环时间很短,按停止键后可以直接停止
      WEnd
      MsgBox(0,"","循环2被停止了")
               
                GUICtrlSetState($GUI_Button_1,$gui_enable)
                GUICtrlSetState($GUI_Button_2,$gui_enable)
EndFunc   

Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If BitAND($wParam, 0xFFFF) = $GUI_Button_stop Then $Flg = False
    Return $GUI_RUNDEFMSG
EndFunc

cbao123 发表于 2011-4-17 07:28:50

还是没有看明白
页: [1]
查看完整版本: 关于GUI按钮产生的循环如何有效的退出