iPAQ 发表于 2012-12-21 12:04:54

请问在Func中循环时如何响应窗体按钮?

本帖最后由 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
页: [1]
查看完整版本: 请问在Func中循环时如何响应窗体按钮?