怎么中断一个sleep
比如,GUI的OnEvent模式,子函数中含有延迟。这样,若子函数的延迟比较大,点击按钮的时候,要怎么中断Sleep呢? 就是说,让点击按钮的响应速度,不会因子函数的sleep而受到影响。 小弟觉得 SLEEP时 可以用热键来执行想要的操作 楼主的意思仍然在sleep中,点击控件时马上执行对应的操作吗?这应该属于多线程的范畴了 将sleep值改小,然后利用循环达到所需时间,循环中判断呢 sleep好像全局停止响应,中断不了 这个真不清楚 没测试过 中断不了吧,和WHILE一样! 本帖最后由 Qokelate 于 2012-4-21 19:48 编辑很明显的程序设计问题
与其思考如何打断Sleep还不如多想想,是否真的需要Sleep?没Sleep真的不行吗?必须Sleep这么长时间吗?
表示从不使用超过Sleep300的飘过,
PS: Onevent模式时候,除了主循环,几乎不需要Sleep 本帖最后由 298311657 于 2012-4-21 21:50 编辑
程序设计问题 回复 9# Qokelate
我觉得应该还是au3不支持多线程的问题,因为不仅仅是sleep影响了按钮响应速度,如果某段代码执行本身需要很长的时间,但是GUI又有了其他的事件,只能是显示“程序没有响应” 回复 5# kevinch
好主意,利用循环来达到延迟时间,我试试 回复 11# xms77
如果是执行功能代码时间过长或无法确定的时候应该给予使用者适当提示或禁止用户对界面进行更改,方法是人想的,多优化思维和代码,就能提高不少的效率
这是我的一个例子,因为不同机器修改计算名时间不同,所以执行时候就把界面隐藏了,防止用户进行更改http://www.autoitx.com/thread-30946-1-1.html 尽量不要使用SLEEP功能,在写GUI的时候 回复 1# zuiyi
试试用AdlibRegister和AdlibUnRegister代替Sleep.
不一定能用,这个看你代码怎么写.
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $parent1, $ok1, $cancel1
Opt("GUICoordMode", 2)
Opt("GUIResizeMode", 1)
Opt("GUIOnEventMode", 1)
$parent1 = GUICreate("父窗 1")
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")
$ok1 = GUICtrlCreateButton("确定", 10, 30, 50)
GUICtrlSetOnEvent(-1, "OKPressed")
$cancel1 = GUICtrlCreateButton("删除", 0, -1)
GUICtrlSetOnEvent(-1, "CancelPressed")
GUISetState(@SW_SHOW)
; 仅虚度时光
While 1
Sleep(10)
WEnd
EndFunc ;==>Example
Func OKPressed()
SplashTextOn("标题", "文本")
AdlibRegister("_Sleep", 5000)
EndFunc ;==>OKPressed
Func CancelPressed()
SplashOff()
AdlibUnRegister("_Sleep")
EndFunc ;==>CancelPressed
Func SpecialEvents()
If @GUI_CtrlId = $GUI_EVENT_CLOSE Then Exit
EndFunc ;==>SpecialEvents
Func _Sleep()
SplashOff()
AdlibUnRegister("_Sleep")
EndFunc ;==>_Sleep
页:
[1]
2