Neuling hat einige Fragen

  • Also ich habe mich, bevor ich die Sache mit der ComboBox eingebaut habe, für den Sleep(5000) entschieden, weil die CPU Auslastung ganz in Ordnung ist so und was aber wichtiger ist, das flackern beim aktualisieren des GUI ist noch erträglich. Selbst mit dem Sleep(100) reagiert das Programm schon recht träge, woran liegt das?

    Ach und Danke für den Hinweis mit dem Cancel Knopf, der funktioniert nun. Mfg

    • Offizieller Beitrag

    Hallo,

    die Trägheit kann eingentlich nur durch dieses ständige _MemoryOpen und _MemoryClose kommen,
    probiers mal so:

    [autoit]

    #include <GUIConstants.au3>
    #include <NomadMemory.au3>
    #include <String.au3>
    #NoTrayIcon

    [/autoit][autoit][/autoit][autoit]

    Local $processList, $comboList, $i, $pid, $quitButton

    [/autoit][autoit][/autoit][autoit]

    $varName = IniRead("Watch.ini", "Address", "Name", "NotFound")
    $varGeld = IniRead("Watch.ini", "Address", "Geld", "NotFound")

    [/autoit][autoit][/autoit][autoit]

    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 1)

    [/autoit][autoit][/autoit][autoit]

    $Gui = GUICreate("Watch", 200, 104)
    $quitButton = GUICtrlCreateButton("Cancel", 148, 76, 50)
    GUICtrlCreateLabel("Name: ", 5, 10)
    GUICtrlCreateLabel("Geld: ", 5, 30)
    GUICtrlCreateLabel("Prozess: ", 5, 60)
    $text = GUICtrlCreateLabel("", 55, 60, 50)
    $comboBox = GUICtrlCreateCombo("", 5, 80, 110, 200, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
    $controlName = GUICtrlCreateLabel("abc", 45, 10, 200)
    $controlGeld = GUICtrlCreateLabel("", 45, 30, 200)
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "", GUICtrlRead($controlName))

    [/autoit][autoit][/autoit][autoit]

    $processList = ProcessList("...")

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To $processList[0][0]
    $comboList &= "|" & $processList[$i][1]
    Next

    [/autoit][autoit][/autoit][autoit]

    GUICtrlSetData($comboBox, $comboList)

    [/autoit][autoit][/autoit][autoit]

    $pid = WinGetProcess("...")
    GUICtrlSetData($text, $pid)
    $info = _MemoryOpen($pid)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE, $quitButton
    Exit
    Case $comboBox
    _MemoryClose($info)
    $pid = GUICtrlRead($comboBox)
    GUICtrlSetData($text, $pid)
    $info = _MemoryOpen($pid)
    EndSwitch

    [/autoit][autoit][/autoit][autoit]

    ;~ $info = _MemoryOpen($pid)
    $varName_read = _MemoryRead("0x" & $varName, $info)
    $varGeld_read = _MemoryRead_dword("0x" & $varGeld, $info)
    $varGeld_format = _StringAddComma($varGeld_read)
    ;~ _MemoryClose($info)

    [/autoit][autoit][/autoit][autoit]

    If GUICtrlRead($controlName) <> $varName_read Then GUICtrlSetData($controlName, $varName_read)
    If GUICtrlRead($controlGeld) <> $varGeld_format Then GUICtrlSetData($controlGeld, $varGeld_format)

    [/autoit][autoit][/autoit][autoit]

    Sleep(100)
    WEnd

    [/autoit]
  • Also erstmal vielen Dank für deine Hilfe Bernd. Soweit scheinen deine Verbesserungen relativ gut zu funktionieren, bin aber noch beim testen. Du meintest die Trägheit komme vom ständigen _MemoryOpen und _MemoryClose, ich verstehe aber nicht ganz, warum das in der Version des Programm ohne die ComboBox keine Probleme macht. Jetzt zB. wenn man das Programm über 'X' oder 'Cancel' schliesst, reagiert es trotz Sleep(100) irgendwie träge. Was ich aber auch dazu sagen muss, in deiner verbesserten Version Bernd flackert die Anzeige nicht mehr beim aktualisieren *freu*.

    • Offizieller Beitrag

    In der Version ohne Combobox lief dein Programm auch noch im OnEvent-Modus!

  • Ahhh in Ordnung. Und ich nehme an eine Möglichkeit das zu beschleunigen ohne den Sleep zu verringern, was ja dann aber wieder steigende CPU Auslastung zur Folge hat, gibt es nicht?

    Was ich noch versucht habe, ist die Abfrage der Prozesse mit in die Schleife zu packen. Wäre praktisch, wenn weitere dazu kommen während das Programm läuft. Die ComboBox wird dann aber überflütet mit PIDs dh. jede PID wird immer und immer wieder dort reingeschrieben. Muss ich die Box vor jedem Durchlauf leeren oder sowas?


    Danke vorab für Hinweise oder Lösungen. Schönen Sonntag noch und Mfg

    • Offizieller Beitrag

    Ich habe dein Programm mal wieder in den OnEvent-Modus umgeschaltet!

    Die Combobox wird jetzt alle 5 sek. aktuallisiert!

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <NomadMemory.au3>
    #include <String.au3>
    #NoTrayIcon

    [/autoit] [autoit][/autoit] [autoit]

    Const $cnRefreshTime = 5000 ; Combobox alle 5000 ms aktualisieren

    [/autoit] [autoit][/autoit] [autoit]

    Local $pid, $info, $tRefresh

    [/autoit] [autoit][/autoit] [autoit]

    $varName = IniRead("Watch.ini", "Address", "Name", "NotFound")
    $varGeld = IniRead("Watch.ini", "Address", "Geld", "NotFound")

    [/autoit] [autoit][/autoit] [autoit]

    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 1)
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $Gui = GUICreate("Watch", 200, 104)
    Local $quitButton = GUICtrlCreateButton("Cancel", 148, 76, 50)
    GUICtrlCreateLabel("Name: ", 5, 10)
    GUICtrlCreateLabel("Geld: ", 5, 30)
    GUICtrlCreateLabel("Prozess: ", 5, 60)
    Local $text = GUICtrlCreateLabel("", 55, 60, 50)
    Local $comboBox = GUICtrlCreateCombo("", 5, 80, 110, 200, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
    Local $controlName = GUICtrlCreateLabel("", 45, 10, 200)
    Local $controlGeld = GUICtrlCreateLabel("", 45, 30, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close_Or_Quit_Clicked")
    GUICtrlSetOnEvent($quitButton, "Close_Or_Quit_Clicked")
    GUICtrlSetOnEvent($comboBox,"ComboBox_Clicked")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    Refresh()
    ComboBox_Clicked()

    [/autoit] [autoit][/autoit] [autoit]

    $tRefresh = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    ;~ $Msg = GUIGetMsg()
    ;~ Switch $Msg
    ;~ Case $GUI_EVENT_CLOSE, $quitButton
    ;~ Exit
    ;~ Case $comboBox
    ;~ _MemoryClose($info)
    ;~ $pid = GUICtrlRead($comboBox)
    ;~ GUICtrlSetData($text, $pid)
    ;~ $info = _MemoryOpen($pid)
    ;~ EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    if TimerDiff($tRefresh) >= $cnRefreshTime Then
    If Refresh() Then ComboBox_Clicked()
    $tRefresh = TimerInit()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $info = _MemoryOpen($pid)
    $varName_read = _MemoryRead("0x" & $varName, $info)
    $varGeld_read = _MemoryRead_dword("0x" & $varGeld, $info)
    $varGeld_format = _StringAddComma($varGeld_read)
    _MemoryClose($info)

    [/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($controlName) <> $varName_read Then GUICtrlSetData($controlName, $varName_read)
    If GUICtrlRead($controlGeld) <> $varGeld_format Then GUICtrlSetData($controlGeld, $varGeld_format)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; Combo aktualisieren
    ; Rückgabe 1 = ComboBox_Clicked muss aufgerufen werden
    Func Refresh()
    Local $retValue = 0
    Local $processList = ProcessList("...")
    Local $comboList = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $processList[0][0]
    $comboList &= "|" & $processList[$i][1]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If (StringInStr($comboList, "|" & $pid) = 0) Or ($pid = "") Then
    $pid = $processList[1][1]
    $retValue = 1
    EndIf
    GUICtrlSetData($comboBox, $comboList, $pid)

    Return $retValue
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Close_Or_Quit_Clicked()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func ComboBox_Clicked()
    $pid = GUICtrlRead($comboBox)
    GUICtrlSetData($text, $pid)
    EndFunc

    [/autoit]
  • Wow, vielen Dank. Die nächsten Tage werde ich nun wahrscheinlich erstmal brauchen um einigermassen nachzuvollziehen was da wo passiert. Nebenher werde ich noch prüfen wie das mit der CPU Auslastung aussieht. Dieser Punkt hat eine hohe Priorität, weil die Anwendung für die dieses Statusprogramm gedacht ist, leider relativ schlecht programmiert ist und selber schon ~99% CPU Auslastung erzeugt, sofern soviel Leistung zur Verfügung seht. Aufgrund dieser Tatsache will ich natürlich versuchen, sowenig wie möglich Ressourcen zu binden.

    Würde mich freuen, wenn ich mich direkt an dich Bernd wenden darf, wenn ich nicht ganz durchsteige. Danke und Mfg

  • Leider noch keine Zeit gefunden mich in den Code einzuarbeiten, aber eine Frage lässt mich die letzten Tage nicht los. Aufgrund des beschriebenen Problems, das die Anwendung für die dieses Programm ist extrem viel CPU Leistung zieht und ich darum nicht unnötig Ressourcen binden will, stelle ich mir folgende Frage. Welcher Modus, MessageLoop oder OnEvent, belastet das System weniger? Kann man da überhaupt eine Aussage machen oder ist das abhängig von dem was das Programm macht?


    Wie immer zu Dank verpflichtet. Mfg Bill

    • Offizieller Beitrag

    Hallo,

    die CPU-Last hat nichts mit dem Modus zu tun!

    Sobald Du in einer Schleife eine Sleep-Anweisung schreibst ist quasi keine CPU-Last mehr vorhanden.
    Einfach mal den folgenden Code ausführen und die CPU-Belastung im Task-Manager beobachten!

    [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit]
  • Ne, im OnEvent Mode Sleept er ja die ganze Zeit wenn nix passiert. Im MessageLoop Mode pollt er die ganze Zeit ob was passiert ist, und pollen kostet immer Ressourcen.

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • Danke für eure Antworten und wieder habe ich eine Frage. Ich möchte in das kleine Programm noch eine Funktion mit einer Checkbox einbauen. Wenn diese ausgewählt ist, ist das Fenster immer im Vordergrund (so wie der Taskmanager). Also irgendwie in der Art '$checkBox = GUICtrlCreateCheckbox("Pin", 160, 50)', dann muss ich vermutlich mit 'If GUICtrlRead($checkBox)' prüfen ob das Teil angehackt wurde und dann irgendwie die Eigenschaft ändern. Ich habe schon '$WS_EX_TOPMOST' gefunden, aber ich weiss nicht wie ich das einbauen soll, oder gibt es noch andere Möglichkeiten?


    Danke wie immer und Mfg Bill

  • Irgendwie habe ich leichte Probleme damit, aber vielleicht kann mir nochmal jemand einen Hinweis geben. Ich erstelle wie in meinem letzten Posting die CheckBox und prüfe sie dann wie folgt, '$pin = GUICtrlRead($checkBox); If $pin = 1 Then GUISetStyle(-1, $WS_EX_TOPMOST)'. Eigentlich hat $pin auch den Wert 1 wenn die CheckBox angeklickt wurde, aber das Fenster bleibt nicht im Vordergrund. Was mache ich da falsch?


    Hab schon irgendwie ein schlechtes Gewissen, wegen so viel hier fragen zu müssen. Bin euch aber wirklich dankbar für die Hilfe. Bill

    • Offizieller Beitrag

    Du schreibst:

    ... Then GUISetStyle(-1, $WS_EX_TOPMOST)

    Setz anstelle der -1 mal die Variable des Fenster-Handle ein.


    Oscar, da bist du leider auf dem Holzweg ;)
    Syntax: GUISetStyle(STYLE, EX_STYLE [, WINHANDLE])

    Die Syntax stimmt also. Der wirkliche TopMost-Effekt, ist tatsächlich nicht ohne weiteres erreichbar. Denn wenn ein anderes Fenster geöffnet wird, das ebenfalls TopMost gesetzt ist, so kommt dieses in den Vordergrund.
    Um dein Fenster, wie den Task-Manager, immer vorn zu halten, mußt du kontinuierlich überwachen (AdlibEnable), welche Fenster vorhanden sind (WinList), und deines immer wieder durch aktivieren nach vorn setzen.
    Bei mehreren Fenstern mit TopMost ist immer das TOP, welches zuletzt gesetzt wurde.

    Achja, das hier:

    [autoit]

    $pin = GUICtrlRead($checkBox)
    If $pin = 1 Then GUISetStyle(-1, $WS_EX_TOPMOST)'

    [/autoit]

    kannst du in einem Aufruf zusammenfassen:

    [autoit]

    If BitAND(GUICtrlRead($checkBox), $GUI_Checked) Then GUISetStyle(-1, $WS_EX_TOPMOST)

    [/autoit]
    • Offizieller Beitrag

    Hi,
    das Problem war der Versuch den Style zu ändern, das hist hier fehl am Platz.
    So geht es:

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    Opt('GUIOnEventMode', 1)
    $gui = GUICreate('')
    GUISetOnEvent($GUI_EVENT_CLOSE, 'end')
    $CheckBox = GUICtrlCreateCheckbox('Check', 10, 10)
    GUICtrlSetOnEvent(-1, 'Checkbox_Clicked')

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func end()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Checkbox_Clicked()
    If BitAND(GUICtrlRead($CheckBox), $GUI_Checked) Then
    WinSetOnTop($gui, '', 1)
    Else
    WinSetOnTop($gui, '', 0)
    EndIf
    EndFunc

    [/autoit]
  • Eine Frage habe ich hierzu noch. Wenn vor dem Start des Programm die Anwendung für die es gedacht ist nicht schon läuft, bekomme ich eine Fehlermeldung. Line -1: Error: Array variable has incorrect number of subscripts or subscripts dimension range exceeded. Ich vermute mal das kommt daher, das bei den Befehlen

    [autoit]

    Local $retValue = 0
    Local $processList = ProcessList("Anwendung")
    Local $comboList = ""

    [/autoit]


    die Anwendung natürlich nicht gefunden werden kann. Wie kann ich diesen Fehler abfangen?

    • Offizieller Beitrag

    Hallo,

    z.B. so:

    [autoit]

    Local $retValue = 0
    ;~ Local $processList = ProcessList("Anwendung")
    Local $comboList = ""

    [/autoit][autoit][/autoit][autoit]

    If ProcessExists("Anwendung") Then
    Local $processList = ProcessList("Anwendung")
    Else
    MsgBox(0, "", "Anwendung läuft nicht!")
    Exit
    EndIf

    [/autoit]

    oder wenn gewartet werden soll bis die Anwendung läuft, so:

    [autoit]

    While Not ProcessExists("Anwendung")
    Sleep(500)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Local $retValue = 0
    Local $processList = ProcessList("Anwendung")
    Local $comboList = ""

    [/autoit]