5

此循环非常占用 CPU:

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

这是我一直使用的。我知道还有其他方法,但哪一种方法对 CPU 的占用最少?

4

2 回答 2

6

我也使用Switch/Case遇到了这个问题。我认为使代码更紧凑并更改为Select/Case会降低 CPU 使用率。我最终所做的是将脚本困在Do/Until 循环中。

此摘录来自位于任务栏中并始终运行的脚本。用户通过单击并从我创建的上下文菜单中进行选择来进行交互。这启动了相应的功能。

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
于 2013-09-27T17:46:32.770 回答
0

正如AutoIt 的开发人员所指出的,“鼠标移动”事件是调用次数第二多的消息,因此您可能还想在“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消息)

于 2016-12-29T14:41:34.520 回答