使用AutoIT优化标签页控制

时间:2019-04-03 15:25:26

标签: performance autoit

因此,我编写此代码来模拟一个具有启动和停止功能并具有tab design的程序。现在,有一个选项卡包含一个RichEdit对象,该对象打算用作运行日志。

如您所见,在我们“启动”程序之后,我只花了几毫秒的sleep来模拟运行指令。我创建了一个函数,用于检查在整个代码中会随机大规模调用的请求,以便对每个发言者GUI进行ping操作。

#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>

Global Const $h_numOfTabs = 2
Global Enum $H_TAB_1, $H_TAB_2, $H_TAB_END
Global $hGui, $h_logRichEdit, $iMsg,  $h_tabs, $h_startButton, $h_stopButton

Example()

Func Example()
    $hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, StringLen(".exe")) & ")", 400, 550, -1, -1)

    ; ADD START AND STOP BUTTONS
    $h_startButton = GUICtrlCreateButton( "Start", 50, 450 )
    $h_stopButton = GUICtrlCreateButton( "Stop", 150, 450 )

    $h_tabs = GUICtrlCreateTab( 5, 5, 390,375 )

    ; LOG TAB
    GUICtrlCreateTabItem( "Log" )
    $h_logRichEdit = _GUICtrlRichEdit_Create ( $hGui, "", 8, 30, 384, 347, BitOR( $ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY ) )

    ; STATS TAB
    GUICtrlCreateTabItem( "Stats" )

    ; Close TABS
    GUICtrlCreateTabItem( "" )

    GUISetState( @SW_SHOW ) ; initialize the gui

    While True
        CheckRequests()
    WEnd
EndFunc   ;==>Example

Func Start()
    while true
        Sleep(100)
        CheckRequests()
    WEnd
EndFunc

Func Stop()

EndFunc

Func CheckRequests()
    $iMsg = GUIGetMsg()
    while $iMsg <> 0
        Select
            Case $iMsg = $GUI_EVENT_CLOSE
                _GUICtrlRichEdit_Destroy($h_logRichEdit) ; needed unless script crashes
                ; GUIDelete()   ; is OK too
                Exit
            Case $iMsg = $h_tabs
                Switch GUICtrlRead( $h_tabs )
                    Case $H_TAB_1
                        ControlShow( $hGui, "", $h_logRichEdit )
                    Case Else
                        ControlHide( $hGui, "", $h_logRichEdit )
                EndSwitch
            Case $iMsg = $h_startButton
                Start()
            Case $iMsg = $h_stopButton
                Stop()
        EndSelect
        $iMsg = GUIGetMsg()
    WEnd
EndFunc

大约500毫秒的睡眠时间,可见切换选项卡时的延迟。

我的问题:在更大的规模上,这是我们在运行较大的程序时如何处理/更新特定于选项卡的内容吗?如果没有,那么在运行较大的整体程序时更新标签特定属性的更有效方法是什么。

最近我还看到了一个设计,其中所有选项卡和相关组件都是它们自己的GUI's,但是我不确定所有内容是否都是其自身GUI的相关性以及是否与这个问题有关。

任何帮助或澄清都将不胜感激,我是AutoIT的新手,它试图找出一些可以做和不能做的事情以及效率。

1 个答案:

答案 0 :(得分:0)

#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>

Global Const $h_numOfTabs = 2
Global Enum $H_TAB_1, $H_TAB_2, $H_TAB_END
Global $hGui, $h_logRichEdit, $iMsg,  $h_tabs, $h_startButton, $h_stopButton

Example()

Func Example()
    $hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, StringLen(".exe")) & ")", 400, 550, -1, -1)

    ; ADD START AND STOP BUTTONS
    $h_startButton = GUICtrlCreateButton( "Start", 50, 450 )
    $h_stopButton = GUICtrlCreateButton( "Stop", 150, 450 )

    $h_tabs = GUICtrlCreateTab( 5, 5, 390,375 )

    ; LOG TAB
    GUICtrlCreateTabItem( "Log" )
    $h_logRichEdit = _GUICtrlRichEdit_Create ( $hGui, "", 8, 30, 384, 347, BitOR( $ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY ) )
    _GUICtrlRichEdit_AppendText($h_logRichEdit, "{\rtf {Showing \b1 Rich Text \b0}")

    ; STATS TAB
    GUICtrlCreateTabItem( "Stats" )

    ; Close TABS
    GUICtrlCreateTabItem( "" )

    ; Register Windows message.
    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

    GUISetState( @SW_SHOW ) ; initialize the gui

    GuiMessageLoop()
EndFunc

Func GuiMessageLoop()
    While 1
        $iMsg = GUIGetMsg()

        Switch $iMsg
            Case $GUI_EVENT_CLOSE
                _GUICtrlRichEdit_Destroy($h_logRichEdit) ; needed unless script crashes
                ; GUIDelete()   ; is OK too
                Exit

            Case $h_startButton
                Start()

            Case $h_stopButton
                Stop()
        EndSwitch
    WEnd
EndFunc

Func Start()
    ConsoleWrite('# Sleep' & @CRLF)
    Sleep(5000)
    ConsoleWrite('# Awake' & @CRLF)
EndFunc

Func Stop()

EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $iLoWord = _WinAPI_LoWord($lParam)
    Local $iHiWord = _WinAPI_HiWord($lParam)
    ConsoleWrite('- WM_NOTIFY' & ' ' & $iLoWord & ' ' & $iHiWord & @CRLF)

    Switch GUICtrlRead( $h_tabs )
        Case $H_TAB_1
            ControlShow( $hGui, "", $h_logRichEdit )
        Case Else
            ControlHide( $hGui, "", $h_logRichEdit )
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

尝试以下示例。它使用GuiRegisterMessage进行捕获 WM_NOTIFY Windows消息。 WM_NOTIFY并不理想 消息代码,尽管还没有找到 更适合仅更改选项卡。

隐藏和显示Rich Edit控件的代码已 移动到WM_NOTIFY函数中,以便每次 收到消息后,将执行Tab隐藏和显示代码。

ConsoleWrite用于显示感兴趣的事件 在测试过程中。如果您的编辑器有输出 控制台窗格,那么您也许可以查看写入 控制台窗格。

如果诸如函数Start之类的事件花费很长时间, 那么多处理可能有助于让Gui 保持对消息循环的响应。

不想做 ,请避免( cyclic )递归函数 调用并避免陷入循环中。


其他参考: