注册多个AdlibRegister函数执行问题
本帖最后由 yuko4632 于 2014-8-22 20:38 编辑注册多个AdlibRegister,发现A不能执行下去。B能正常执行。
这种情况该怎么解决?
#include <Date.au3>
AdlibRegister("_A",100)
AdlibRegister("_B",300)
While 1
WEnd
Func _A()
ConsoleWrite("输出A" &@LF)
MsgBox(48, "A!", "A错误。", 15)
EndFunc
Func _B()
$sNewDate2 = _DateAdd('s', 5, _NowCalc()) ;定义运行周期
While 1
Sleep(1000)
$nowdate = _NowCalc() ;获取当前时间
If $nowdate = $sNewDate2 Then
ConsoleWrite("输出B" &@LF)
MsgBox(48, "B!", "B错误。", 15)
$sNewDate2 = _DateAdd('s', 5, _NowCalc()) ;重新定义运行周期,以进行下次任务
EndIf
WEnd
EndFunc
本帖最后由 user3000 于 2014-8-22 20:46 编辑
回复 1# yuko4632
msgbox inputbox 等阻断型函数会让整个程序停滞下来;
所以注册函数时,不应该在其内包含这类函数.
B函数又有个无限循环,程序已经"死"在这里头了;自然无法执行其他语句.
主循环,建议不使用空循环,应该至少插入适当的延迟:sleep(...)
这样才会降低程序对CPU的占用. _B如果不用循环函数就不能达到效果。
纠结,除非用多线程吗? 回复 3# yuko4632
你是隔300ms调用一次,难道你想隔300ms创建一个while循环? 回复 3# yuko4632
AdlibRegister 注册的函数本来就可以实现"无限循环"的效果.
你代码稍稍修改一下:
Global $sNewDate2 = _DateAdd('s', 5, _NowCalc()) ;定义运行周期
AdlibRegister("_B",1000)
;......
Func _B()
$nowdate = _NowCalc()
If $nowdate = $sNewDate2 Then
ConsoleWrite("输出B" &@LF)
; MsgBox(48, "B!", "B错误。", 15)
$sNewDate2 = _DateAdd('s', 5, _NowCalc()) ;重新定义运行周期,以进行下次任务
EndIf
EndFunc
前来学习。。。。。。。。。。。。。。。。。。。。。。。。 本帖最后由 tvzml 于 2014-9-12 13:24 编辑
AdlibRegister 间隔时间建议 不小于300 ,100的话,肯定是不会执行其他调用了,整个程序会被 100调用的优先占用 ,其他压根就不执行了,这就是优化程序的敲门了,程序的优先处理 ,以及尽量不使用 sleep 和 MsgBox 等导致 暂停的 语句为好。
楼主犯了多个大忌 ,调用里面使用 While 1这个内循环 无意义,完全可以 前面的 While 1 来担当 ,调用里面 的sleep 直接暂停了整个程序,AdlibRegister 100 和 AdlibRegister 300 就失去 定时器的意义了 哎·····注意 AdlibRegister 不是多线程·
程序还事只有一个人在执行,AdlibRegister 的功能只是定时的问下这个人 这会帮我擦屁屁可以不? 这个人没被累死没忙就帮你擦了····仅此而已·· AdlibRegister 不能有提示函数之类的!不过你可以当 AdlibRegister 这个做循环用!与注销一起用!效果就不一样了!
页:
[1]