找回密码
 加入
搜索
查看: 3087|回复: 4

[系统综合] [已解决]大侠帮忙看看这个循环控制的问题

  [复制链接]
发表于 2011-1-5 22:56:32 | 显示全部楼层 |阅读模式
本帖最后由 lon91ong 于 2011-1-7 09:04 编辑
#include <GUIConstantsEx.au3>
;~ Opt("GUIOnEventMode", 1)
Opt('TrayMenuMode',1)
HotKeySet("{F8}","StartEvt")
HotKeySet("{F7}","PauseEvt")

$Form1_1 = GUICreate("GUI测试", 230, 120, 192, 60)
$StartBtn = GUICtrlCreateButton("开始(F8)", 20, 40, 81, 30)
;~ GUICtrlSetOnEvent(-1, "StartEvt")
$PauseBtn = GUICtrlCreateButton("暂停(F7)", 132, 40, 81, 30)
;~ GUICtrlSetOnEvent(-1, "PauseEvt")
GUICtrlSetState($PauseBtn, $GUI_DISABLE);没有开始,不能暂停
GUISetState(@SW_SHOW)

Global $cycle=1

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE        ;关闭窗口
                        ExitLoop
                        Exit
                Case $StartBtn ;开始
                        StartEvt()
                Case $PauseBtn ;停止
                        PauseEvt()
        EndSwitch
WEnd

Func StartEvt()
        GUICtrlSetState($StartBtn, $GUI_DISABLE);不能重复开始
        GUICtrlSetState($PauseBtn, $GUI_ENABLE)        ;激活暂停
        While $cycle
                ;这里放了一些代码
        WEnd
EndFunc
Func PauseEvt()
        GUICtrlSetState($StartBtn, $GUI_ENABLE)        ;激活开始
        GUICtrlSetState($PauseBtn, $GUI_DISABLE);关闭暂停
        ;希望通过改变$cycle的量来控制StartEvt中的死循环停止
        If $cycle=1 Then
                $cycle=0
        EndIf
EndFunc
现在的问题是,暂停按钮总是不管用,而热键F7功能正常!

请大侠帮忙看看,应该怎么改改!
多谢大侠!
发表于 2011-1-5 23:52:28 | 显示全部楼层
再拷一份消息循环控制代码到函数中进行监控就可以~~~
#include <GUIConstantsEx.au3>
;~ Opt("GUIOnEventMode", 1)
Opt('TrayMenuMode', 1)
HotKeySet("{F8}", "StartEvt")
HotKeySet("{F7}", "PauseEvt")

$Form1_1 = GUICreate("GUI测试", 230, 120, 192, 60)
$StartBtn = GUICtrlCreateButton("开始(F8)", 20, 40, 81, 30)
;~ GUICtrlSetOnEvent(-1, "StartEvt")
$PauseBtn = GUICtrlCreateButton("暂停(F7)", 132, 40, 81, 30)
;~ GUICtrlSetOnEvent(-1, "PauseEvt")
GUICtrlSetState($PauseBtn, $GUI_DISABLE);没有开始,不能暂停
GUISetState(@SW_SHOW)

Global $cycle = 1

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE ;关闭窗口
                        ExitLoop
                        Exit
                Case $StartBtn ;开始
                        StartEvt()
                Case $PauseBtn ;停止
                        PauseEvt()
        EndSwitch
WEnd

Func StartEvt()
        GUICtrlSetState($StartBtn, $GUI_DISABLE);不能重复开始
        GUICtrlSetState($PauseBtn, $GUI_ENABLE) ;激活暂停
        While 1
                $nMsg = GUIGetMsg()
                Switch $nMsg
                        Case $PauseBtn ;停止
                                PauseEvt()
                EndSwitch

                ;这里放了一些代码
                ConsoleWrite(@LF & @KBLayout & @CR)
                If $cycle Then
                        ContinueLoop
                ElseIf Not $cycle Then
                        ExitLoop
                EndIf

        WEnd

EndFunc   ;==>StartEvt
Func PauseEvt()
        GUICtrlSetState($StartBtn, $GUI_ENABLE) ;激活开始
        GUICtrlSetState($PauseBtn, $GUI_DISABLE);关闭暂停
        ;希望通过改变$cycle的量来控制StartEvt中的死循环停止
        If $cycle = 1 Then
                $cycle = 0
        EndIf
EndFunc   ;==>PauseEvt
 楼主| 发表于 2011-1-6 15:31:54 | 显示全部楼层
本帖最后由 lon91ong 于 2011-1-6 15:33 编辑

楼上的方法尽管有效,但还是有个缺点!
当StartEvt()函数的循环体中有Sleep(10000)等待时,暂停按钮的响应不是及时的!
而热键就不存在这个问题,能够做出及时的响应,不知道是为什么?!
发表于 2011-1-6 21:46:33 | 显示全部楼层
#include <GUIConstantsEx.au3>
;~ Opt("GUIOnEventMode", 1)
Opt('TrayMenuMode', 1)
HotKeySet("{F8}", "StartEvt")
HotKeySet("{F7}", "PauseEvt")

$Form1_1 = GUICreate("GUI测试", 230, 120, 192, 60)
$StartBtn = GUICtrlCreateButton("开始(F8)", 20, 40, 81, 30)
;~ GUICtrlSetOnEvent(-1, "StartEvt")
$PauseBtn = GUICtrlCreateButton("暂停(F7)", 132, 40, 81, 30)
;~ GUICtrlSetOnEvent(-1, "PauseEvt")
GUICtrlSetState($PauseBtn, $GUI_DISABLE);没有开始,不能暂停
GUISetState(@SW_SHOW)

Global $cycle = 1

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE ;关闭窗口
                        ExitLoop
                        Exit
                Case $StartBtn ;开始
                        StartEvt()
                Case $PauseBtn ;停止
                        AdlibUnRegister("_pk")
                        PauseEvt()
        EndSwitch
WEnd
;---------------------------------------/
Func StartEvt()
        GUICtrlSetState($StartBtn, $GUI_DISABLE);不能重复开始
        GUICtrlSetState($PauseBtn, $GUI_ENABLE) ;激活暂停

        Local $pk = 0
        While 1
                $nMsg = GUIGetMsg()
                Switch $nMsg
                        Case $PauseBtn ;停止
                                PauseEvt()
                EndSwitch

                ;这里放了一些代码(延时执行)……用自动函数替代
                ;------------------------
                If Not $pk Then
                        AdlibRegister("_pk", 10000)
                        $pk = 1
                EndIf
                ;-------------------------

                If $cycle Then
                        ContinueLoop
                ElseIf Not $cycle Then
                        ExitLoop
                EndIf

        WEnd

EndFunc   ;==>StartEvt
;---------------------------------------/
Func PauseEvt()
        GUICtrlSetState($StartBtn, $GUI_ENABLE) ;激活开始
        GUICtrlSetState($PauseBtn, $GUI_DISABLE);关闭暂停
        ;希望通过改变$cycle的量来控制StartEvt中的死循环停止
        If $cycle = 1 Then
                $cycle = 0
        EndIf
EndFunc   ;==>PauseEvt
;---------------------------------------/
Func _pk()
        AdlibUnRegister("_pk")

        ;这里放了一些代码
        ConsoleWrite(@LF & @KBLayout & @CR)

        GUICtrlSetState($StartBtn, $GUI_ENABLE) ;激活开始
        GUICtrlSetState($PauseBtn, $GUI_DISABLE);关闭暂停
        $cycle = 0
        MsgBox(0,0,"PK结束",2)

EndFunc   ;==>_pk
;---------------------------------------/

评分

参与人数 1金钱 +11 收起 理由
lon91ong + 11 多谢大侠帮忙!

查看全部评分

 楼主| 发表于 2011-1-7 09:00:35 | 显示全部楼层

多谢大侠!

确实有效啊,不过还没有看懂!

留着自己慢慢学习吧!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-2 13:13 , Processed in 0.081946 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表