找回密码
 加入
搜索
查看: 2921|回复: 0

[GUI管理] 请问在Func中循环时如何响应窗体按钮?

[复制链接]
发表于 2012-12-21 12:04:54 | 显示全部楼层 |阅读模式
本帖最后由 iPAQ 于 2012-12-21 13:25 编辑

在使用循环时并需要响应窗体按钮时发现个现象:
程序在主体执行中有循环时可响应按钮事件,但在Func中循环时不能立刻响应按钮事件,会记住按钮事件在退出循环后再响应。
想请教一下这两种情况为何有区别?

搜索了以前帖子发现
【已解决】痛苦的while循环 http://www.autoitx.com/forum.php?mod=viewthread&tid=16334
关于处理循环中的按键与窗体响应问题(避免“假死”) http://www.autoitx.com/forum.php?mod=viewthread&tid=18773
这两贴,第二个帖子可能解决我这个在Func中循环时不能立刻响应按钮事件问题,但本人水平较差,不能很好理解,只能照搬,如果能找出前面说的两种情况不同的原因可能就有更简便方法解决这个问题了。
如果只有一个循环还可以放在主体中执行,要是有多个需要同时执行就麻烦了。

主体中循环代码如下:
Opt("GUIOnEventMode",1)
        
$GUImain=GUICreate("test" , 520, 480, -1, -1)
GUISetFont(10)
GUISetOnEvent(-3, "gui",$GUImain)

$BTstart=GUICtrlCreateButton("开始测试",30,210,80,22) 
$BTstop=GUICtrlCreateButton("停止测试",30,210,80,22) 
$BTquit=GUICtrlCreateButton("退出", 430, 210, 40, 22)
$label1=GUICtrlCreateLabel("测试",100,100,100,30)

GUICtrlSetOnEvent($BTstart, "gui")
GUICtrlSetOnEvent($BTstop, "gui")
GUICtrlSetOnEvent($BTquit, "gui")

GUICtrlSetState($BTstop,32+128)

GUISetState(@SW_SHOW,$GUImain)        
Global $Start,$Stop
$Start=0
        

While 1
        Test()
WEnd

Func gui()
        MsgBox(0,"gui()","@GUI_CtrlId=" & @GUI_CtrlId)
    Switch @GUI_CtrlId
                Case -3
                        Switch @GUI_WINHANDLE
                Case $GUImain
                    Exit
            EndSwitch

                Case $BTstart
                         StartTest()
                         
                Case $BTstop
                         StopTest()
                         
                Case $BTquit
                         Exit                 
        EndSwitch

EndFunc   ;==>gui

Func StartTest()
        $Start=1
EndFunc

Func StopTest()
        $Start=0
EndFunc

Func Test()
        If $Start=1 Then
                If GUICtrlGetState($BTstart)=16+64 Then GUICtrlSetState($BTstart,32+128)
                   If GUICtrlGetState($BTstop)=32+128 Then GUICtrlSetState($BTstop,16+64)
                   $cc=1
                   While 1
                        GUICtrlSetData($label1,$cc)
                           If $Start=0 Then ExitLoop 1
                        Sleep(500)
                        $cc+=1
                   WEnd
           Else                
                   If GUICtrlGetState($BTstop)=16+64 Then GUICtrlSetState($BTstop,32+128)
                   If GUICtrlGetState($BTstart)=32+128 Then GUICtrlSetState($BTstart,16+64)
        EndIf
EndFunc
.
.
.

Func中循环代码如下:
Opt("GUIOnEventMode",1)
        
$GUImain=GUICreate("test" , 520, 480, -1, -1)
GUISetFont(10)
GUISetOnEvent(-3, "gui",$GUImain)

$BTstart=GUICtrlCreateButton("开始测试",30,210,80,22) 
$BTstop=GUICtrlCreateButton("停止测试",30,210,80,22) 
$BTquit=GUICtrlCreateButton("退出", 430, 210, 40, 22)
$label1=GUICtrlCreateLabel("测试",100,100,100,30)

GUICtrlSetOnEvent($BTstart, "gui")
GUICtrlSetOnEvent($BTstop, "gui")
GUICtrlSetOnEvent($BTquit, "gui")

GUICtrlSetState($BTstop,32+128)

GUISetState(@SW_SHOW,$GUImain)        
Global $Start,$Stop
$Start=0
        
While 1
                        
WEnd



Func gui()
        MsgBox(0,"gui()","@GUI_CtrlId=" & @GUI_CtrlId)
    Switch @GUI_CtrlId
                Case -3
                        Switch @GUI_WINHANDLE
                Case $GUImain
                    Exit
            EndSwitch

                Case $BTstart
                         StartTest()
                         
                Case $BTstop
                         StopTest()
                         
                Case $BTquit
                         Exit                 
        EndSwitch

EndFunc   ;==>gui

Func StartTest()
        $Start=1
        Test()
EndFunc

Func StopTest()
        $Start=0
        Test()
EndFunc

Func Test()
        If $Start=1 Then
                If GUICtrlGetState($BTstart)=16+64 Then GUICtrlSetState($BTstart,32+128)
                   If GUICtrlGetState($BTstop)=32+128 Then GUICtrlSetState($BTstop,16+64)
                   $cc=1
                   While 1
                        GUICtrlSetData($label1,$cc)
                           If $Start=0 Then ExitLoop 1
                        Sleep(500)
                        $cc+=1
                   WEnd
           Else                
                   If GUICtrlGetState($BTstop)=16+64 Then GUICtrlSetState($BTstop,32+128)
                   If GUICtrlGetState($BTstart)=32+128 Then GUICtrlSetState($BTstart,16+64)
        EndIf
EndFunc
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 00:43 , Processed in 0.081222 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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