微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/vb/263240.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐