此循环非常 CPU密集型:
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
GUIDelete()
Exit
Case $control1
Func1()
Case $control2
Func2()
EndSwitch
WEnd
这是我一直使用的。我知道还有其他方法,但哪一个是CPU密集度最低的?
答案 0 :(得分:6)
我也使用Switch/Case遇到了这个问题。我认为使代码更紧密,更改为Select/Case会降低CPU使用率。我最终做的是将脚本陷入a Do/Until loop。
此摘录来自一个位于任务栏中并始终运行的脚本。用户通过单击并从我创建的上下文菜单中进行选择进行交互这开启了各自的功能。
While 1
Do
$msg = TrayGetMsg()
Until $msg <> 0
Select
Case $msg = $ItemDeviceModel
DeviceModel()
Case $msg = $ItemSerial
SerialNumber()
Case $msg = $ExitItem
Exit
EndSelect
WEnd
在此示例中,脚本循环快速简单的Do / Until(等待用户单击应用程序图标)。循环中断后,Select / Case运行。
使用以下代码切换代码:
While 1
Do
$msg = GUIGetMsg()
Until $msg <> 0
Switch $msg
Case $GUI_EVENT_CLOSE
GUIDelete()
Exit
Case $control1
Func1()
Case $control2
Func2()
EndSwitch
WEnd
答案 1 :(得分:0)
由AutoIt的开发人员作为pointed out,“鼠标移动”事件是第二大被调用的消息,因此您可能希望在“0”消息之后对其进行预过滤。
#include <GUIConstantsEx.au3>
While 1
Switch GUIGetMsg()
Case 0, $GUI_EVENT_MOUSEMOVE
ContinueLoop
Case $control1
Func1()
Case $control2
Func2()
EndSwitch
WEnd
由于GUIGetMsg()
,我尝试观看多个消息来源,即TrayGetMsg()
和ContinueLoop
,我遇到了困难。
但解决方案实际上很简单,不要快捷循环,只需断开开关(记住断点隐含在AutoIt中):
#include <GUIConstantsEx.au3>
While 1
Switch GUIGetMsg()
Case 0, $GUI_EVENT_MOUSEMOVE
; break
Case $control1
Func1()
Case $control2
Func2()
EndSwitch
Switch TrayGetMsg()
Case 0, $GUI_EVENT_MOUSEMOVE
; break
Case $control3
Func3()
Case $control4
Func4()
EndSwitch
WEnd
(我刚检查过,TrayGetMsg()
确实发送了$GUI_EVENT_MOUSEMOVE
条消息)