最少的CPU密集型循环

时间:2013-09-27 03:57:51

标签: performance cpu autoit

此循环非常 CPU密集型:

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            Exit
        Case $control1
            Func1()
        Case $control2
            Func2()
    EndSwitch
WEnd

这是我一直使用的。我知道还有其他方法,但哪一个是CPU密集度最低的?

2 个答案:

答案 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条消息)