最近用AutoIt3写了一个ADSL拨号计时小工具,主要是为了学习AutoIt3。
习惯VB编程,于是采用其OnEvent(事件驱动)模式,即:Opt("GUIOnEventMode",1)
本来定时采用的是:
While 1
MainFun()
Sleep(1000) ; 间隔
WEnd
很明显,这样做是不准的。本意是一秒执行一次MainFun(),变成执行MainFun()后间隔一秒了。
于是在网上找到一个范例:AutoIT中多定时器用法实例。参照之,
While 1
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
DllCall("user32.dll","int","KillTimer","hwnd","uint",$uiTimer[0])
DllCallbackFree ($pTimerProc)
Exit
Case Else
;;;
EndSelect
WEnd
Func _TimerProc($hWnd,$uiMsg,$idEvent,$dwTime)
Switch $idEvent
Case $uiTimer[0]
MainFun()
Case Else
EndSwitch
EndFunc
改完运行,OK。。。
可无意间发现该程序执行时cpu占有50%!!还好我是T5500的,不然早当机了。开始怀疑是AutoIt3执行效率问题,再怀疑是自己的脚本些的效率太低,于是注销所有有效代码,仅仅执行:
While 1
;;;
WEnd
可cpu还是50%!!
凭直觉,认为是代码用的有问题。比较范例,发现就是我的采用了OnEvent(事件驱动),而它是默认消息循环模式,试着注销Opt("GUIOnEventMode",1),cpu使用果然只有1%不到!看来这一句的确和范例采用的定时方法“相斥”!
无奈之下,只好乖乖使用:
While 1
MainFun()
Sleep(1000) ; 间隔
WEnd
改天再研究问题本质吧!
PS:其实就算采用范例的定时,一样的不准。一分钟下来能慢1秒……也许是MainFun()执行太耗时了?-_-!!!