zuiyi 发表于 2012-4-21 13:02:33

怎么中断一个sleep

比如,GUI的OnEvent模式,子函数中含有延迟。这样,若子函数的延迟比较大,点击按钮的时候,要怎么中断Sleep呢?

zuiyi 发表于 2012-4-21 13:03:41

就是说,让点击按钮的响应速度,不会因子函数的sleep而受到影响。

魔导 发表于 2012-4-21 14:34:51

小弟觉得   SLEEP时   可以用热键来执行想要的操作

zch11230 发表于 2012-4-21 14:51:39

楼主的意思仍然在sleep中,点击控件时马上执行对应的操作吗?这应该属于多线程的范畴了

kevinch 发表于 2012-4-21 16:06:26

将sleep值改小,然后利用循环达到所需时间,循环中判断呢

netegg 发表于 2012-4-21 17:50:18

sleep好像全局停止响应,中断不了

vason1019 发表于 2012-4-21 19:01:43

这个真不清楚 没测试过

卫和谐 发表于 2012-4-21 19:41:35

中断不了吧,和WHILE一样!

Qokelate 发表于 2012-4-21 19:47:18

本帖最后由 Qokelate 于 2012-4-21 19:48 编辑

很明显的程序设计问题
与其思考如何打断Sleep还不如多想想,是否真的需要Sleep?没Sleep真的不行吗?必须Sleep这么长时间吗?
表示从不使用超过Sleep300的飘过,

PS: Onevent模式时候,除了主循环,几乎不需要Sleep

298311657 发表于 2012-4-21 21:43:54

本帖最后由 298311657 于 2012-4-21 21:50 编辑

程序设计问题

xms77 发表于 2012-4-21 22:05:05

回复 9# Qokelate
我觉得应该还是au3不支持多线程的问题,因为不仅仅是sleep影响了按钮响应速度,如果某段代码执行本身需要很长的时间,但是GUI又有了其他的事件,只能是显示“程序没有响应”

zuiyi 发表于 2012-4-21 23:40:34

回复 5# kevinch


   好主意,利用循环来达到延迟时间,我试试

Qokelate 发表于 2012-4-22 00:02:58

回复 11# xms77


    如果是执行功能代码时间过长或无法确定的时候应该给予使用者适当提示或禁止用户对界面进行更改,方法是人想的,多优化思维和代码,就能提高不少的效率

这是我的一个例子,因为不同机器修改计算名时间不同,所以执行时候就把界面隐藏了,防止用户进行更改http://www.autoitx.com/thread-30946-1-1.html

58fly 发表于 2012-4-22 14:20:33

尽量不要使用SLEEP功能,在写GUI的时候

lixiaolong 发表于 2012-4-23 15:10:20

回复 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
查看完整版本: 怎么中断一个sleep