AUTOIT3的OnEvent事件驱动模式一处BUG?

最近用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()执行太耗时了?-_-!!!

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...