|
本帖最后由 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
|
|