Schleifen Probleme (aktualisieren von labels + events bei button betätigung)

  • Hallo liebe AutoIT Community,

    Lang lang ists her, dass ich ein kleines management Script
    geschrieben hab, dass im groben eine übersicht über
    laufende server prozesse gab (apache,mysql und sowas)
    also ob ein prozess läuft oder nicht.
    dazu habe ich noch buttons erstellt damit die
    Prozesse bei bedarf gestartet/gestoppt werden können.

    Um die Button Events aufzufangen benutze ich eine While schleife
    (While 1 ....) ;)
    um die Labels mit dem Status des Prozesses nun automatisch
    zu aktualisieren habe ich ein wenig zumgetüftelt, habs mir sleep versucht früher, ein paar andere sachen
    aber bin nie weiter gekommen.

    Heute habe ich noch einmal ins forum geschaut und gesucht und habe
    eine mögliche Lösung mit sleep gefunden, die auch funktioniert,
    allerdings werden die Button events viel zu spät aufgerufen
    (ich drücke mysql starten und das fenster des mysql servers kommt dann nach 20 sekunden ca. XD)
    mein sleep geht eine halbe sekunde und der rechner ist null ausgelastet °_°

    Weiß da jemand zu helfen?
    (Code Ausschnitte wären lieferbar, wenn ihr sie braucht)


    Grüße TheJoker89

  • Hi, schau Dir mal folgendes an:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GUIListView.au3>

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

    main()

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

    Func OnAutoItStart()
    Opt("MustDeclareVars", 1)
    EndFunc ;==>OnAutoItStart

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

    Func main()
    Local $h_listview = 0, $h_togglebt = 0
    Local $n_timer = 0
    Local $s_state = ""

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

    GUICreate("Dienste", 320, 240)
    $h_listview = GUICtrlCreateListView("Dienst|Status", 5, 5, 310, 200)
    $h_togglebt = GUICtrlCreateButton("An/Aus", 5, 215, 60, 20)

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

    GUICtrlCreateListViewItem("Apache|an", $h_listview)
    GUICtrlCreateListViewItem("MySQL|aus", $h_listview)
    GUISetState(@SW_SHOW)

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

    $n_timer = TimerInit()
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $h_togglebt
    SimulateToggleState(_GUICtrlListViewGetCurSel($h_listview), $h_listview)
    EndSwitch

    If TimerDiff($n_timer) > 3000 Then
    SimulateToggleState(Random(0, 1, 1), $h_listview)
    $n_timer = TimerInit()
    EndIf
    WEnd
    EndFunc ;==>main

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

    Func OnAutoItExit()
    GUIDelete()
    EndFunc ;==>OnAutoItExit

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

    Func SimulateToggleState(Const $I_INDEX, ByRef Const $H_LVIEW)
    Local $s_state = "an"
    If _GUICtrlListViewGetItemText($H_LVIEW, $I_INDEX, 1) = "an" Then $s_state = "aus"
    _GUICtrlListViewSetItemText($H_LVIEW, $I_INDEX, 1, $s_state)
    EndFunc ;==>SimulateToggleState

    [/autoit]


    Ich simuliere hier aber alle drei Sekunden das Ändern des Status eines (von mir ausgedachten Prozesses). Der Button wechselt hier den Status (natürlich nur den Text)!

    Lässt sich aber ja ganz einfach auf Deine Bedürfnisse anpassen!
    Und lass die Sleeps weg. Es gibt kaum ein Problem, was sich nicht auch ohne Sleeps lösen lässt. Sleeps sind das letzte, nur gut zum idlen!

  • Hier wäre der komplette code (leicht geändert XD)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    $port = IniRead("Tools\config.ini","config","port","3366")
    $Form1_1 = GUICreate("Server Manager", 458, 420, 193, 115)
    $Apache = GUICtrlCreateGroup("Apache Web Server", 8, 16, 209, 177)
    $Apache_caption = GUICtrlCreateLabel("Apache Web Server is:", 16, 40, 114, 17)
    if ProcessExists("apache.exe") Then
    $Apache_status = GUICtrlCreateLabel("started", 160, 40, 50, 17)
    ElseIf NOT ProcessExists("apache.exe") Then
    $Apache_status = GUICtrlCreateLabel("not started", 160, 40, 50, 17)
    EndIf
    $start_stop_apache = GUICtrlCreateButton("start / stop", 40, 120, 145, 41, 0)
    GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $MySQL = GUICtrlCreateGroup("MySQL Server", 240, 16, 209, 177)
    $MySQL_caption = GUICtrlCreateLabel("MySQL Server is:", 248, 40, 86, 17)
    if ProcessExists("mysqld.exe") Then
    $MySQL_status = GUICtrlCreateLabel("started", 395, 40, 50, 17)
    ElseIf NOT ProcessExists("mysqld.exe") Then
    $MySQL_status = GUICtrlCreateLabel("not started", 395, 40, 50, 17)
    EndIf
    $start_stop_mysql = GUICtrlCreateButton("start / stop", 272, 120, 145, 41, 0)
    GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $noch_ein_anderer_server_label = GUICtrlCreateGroup("Ein anderer Server", 8, 200, 209, 177)
    $noch_ein_anderer_server_label_caption = GUICtrlCreateLabel("Ein anderer Server is:", 16, 224, 142, 17)
    if ProcessExists("anderer_server.exe") Then
    $noch_ein_anderer_server_status = GUICtrlCreateLabel("started", 160, 224, 50, 17)
    ElseIf NOT ProcessExists("anderer_server.exe") Then
    $noch_ein_anderer_server_status = GUICtrlCreateLabel("not started", 160, 224, 50, 17)
    EndIf
    $start_stop_noch_ein_anderer_server = GUICtrlCreateButton("start / stop", 40, 304, 145, 41, 0)
    GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $anderer_server_label = GUICtrlCreateGroup("Noch ein anderer Server", 240, 200, 209, 177)
    $anderer_server_label_caption = GUICtrlCreateLabel("Noch ein anderer Server:", 248, 224, 118, 17)
    if ProcessExists("noch_ein_anderer_server.exe") Then
    $Anderer_status = GUICtrlCreateLabel("started", 395, 224, 50, 17)
    ElseIf NOT ProcessExists("noch_ein_anderer_server.exe") Then
    $Anderer_status = GUICtrlCreateLabel("not started", 395, 224, 50, 17)
    EndIf
    $start_stop_anderer_server_label = GUICtrlCreateButton("start / stop", 272, 304, 145, 41, 0)
    GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    $refresh = GUICtrlCreateButton("refresh", 160, 380, 145, 41, 0)
    Func refresh()
    if ProcessExists("anderer_server.exe") Then
    GUICtrlDelete($Anderer_status)
    $Anderer_status = GUICtrlCreateLabel("started", 395, 224, 50, 17)
    EndIf
    if NOT ProcessExists("anderer_server.exe") Then
    GUICtrlDelete($Anderer_status)
    $Anderer_status = GUICtrlCreateLabel("not started", 395, 224, 50, 17)
    EndIf
    if ProcessExists("noch_ein_anderer_server") Then
    GUICtrlDelete($noch_ein_anderer_server_status)
    $noch_ein_anderer_server_status = GUICtrlCreateLabel("started", 160, 224, 50, 17)
    EndIf
    if NOT ProcessExists("noch_ein_anderer_server") Then
    GUICtrlDelete($noch_ein_anderer_server_status)
    $noch_ein_anderer_server_status = GUICtrlCreateLabel("not started", 160, 224, 50, 17)
    EndIf
    if ProcessExists("apache.exe") Then
    GUICtrlDelete($Apache_status)
    $Apache_status = GUICtrlCreateLabel("started", 160, 40, 50, 17)
    EndIf
    if NOT ProcessExists("apache.exe") Then
    GUICtrlDelete($Apache_status)
    $Apache_status = GUICtrlCreateLabel("not started", 160, 40, 50, 17)
    EndIf
    if ProcessExists("mysqld.exe") Then
    GUICtrlDelete($MySQL_status)
    $MySQL_status = GUICtrlCreateLabel("started", 395, 40, 50, 17)
    EndIf
    if NOT ProcessExists("mysqld.exe") Then
    GUICtrlDelete($MySQL_status)
    $MySQL_status = GUICtrlCreateLabel("not started", 395, 40, 50, 17)
    EndIf
    EndFunc
    While 1
    sleep(500)
    refresh()
    $nMsg = GUIGetMsg()
    Switch $nMsg

    Case $GUI_EVENT_CLOSE
    Exit

    Case $start_stop_apache
    GUICtrlDelete($Apache_status)
    if ProcessExists("apache.exe") Then
    Run("xampplite\apache\bin\pv -f -k apache.exe -q")
    $Apache_status = GUICtrlCreateLabel("not started", 160, 40, 50, 17)
    ElseIf NOT ProcessExists("apache2.exe") Then
    Run(@ComSpec & " /c " & 'start "Apache Web Server" xampplite\apache\bin\apache.exe', "")
    $Apache_status = GUICtrlCreateLabel("started", 160, 40, 50, 17)
    EndIf
    refresh()
    Case $start_stop_mysql
    GUICtrlDelete($MySQL_status)
    if ProcessExists("mysqld.exe") Then
    If ProcessExists("anderer_server.exe") Then
    If WinExists("Anderer Server") Then
    BlockInput(1)
    WinActivate("Anderer Server")
    Send("exit{ENTER}")
    BlockInput(0)
    WinWaitClose("Anderer Server")
    EndIf
    If WinExists("anderer_server.exe") Then
    BlockInput(1)
    WinActivate("anderer_server.exe")
    Send("exit{ENTER}")
    BlockInput(1)
    WinWaitClose("anderer_server.exe")
    EndIf
    EndIf
    if ProcessExists("noch_ein_anderer_server") Then
    If WinExists("Anderer Server") Then
    WinClose("Anderer Server")
    EndIf
    If WinExists("noch_ein_anderer_server") Then
    WinClose("noch_ein_anderer_server")
    EndIf
    EndIf
    Run("xampplite\mysql\bin\mysqladmin --user=root --password=mangos --port=" & $port & " shutdown")
    $MySQL_status = GUICtrlCreateLabel("not started", 395, 40, 50, 17)
    ElseIf NOT ProcessExists("mysqld.exe") Then
    Run(@ComSpec & " /c " & 'start "MySQL Server" xampplite\mysql\bin\mysqld --defaults-file=xampplite\mysql\bin\my.cnf --standalone --console', "")
    $MySQL_status = GUICtrlCreateLabel("started", 395, 40, 50, 17)
    EndIf
    refresh()
    Case $start_stop_anderer_server_label
    GUICtrlDelete($Anderer_status)
    if ProcessExists("anderer_server.exe") Then
    If WinExists("Anderer Server") Then
    BlockInput(1)
    WinActivate("Anderer Server")
    Send("exit{ENTER}")
    BlockInput(0)
    WinWaitClose("Anderer Server")
    EndIf
    If WinExists("anderer_server.exe") Then
    BlockInput(1)
    WinActivate("anderer_server.exe")
    Send("exit{ENTER}")
    BlockInput(1)
    WinWaitClose("anderer_server.exe")
    EndIf
    $Anderer_status = GUICtrlCreateLabel("not started", 395, 224, 50, 17)
    ElseIf NOT ProcessExists("anderer_server.exe") Then
    IF NOT ProcessExists("mysqld.exe") Then
    Run(@ComSpec & " /c " & 'start "MySQL Server" xampplite\mysql\bin\mysqld --defaults-file=xampplite\mysql\bin\my.cnf --standalone --console', "")
    GUICtrlDelete($MySQL_status)
    $MySQL_status = GUICtrlCreateLabel("started", 395, 40, 50, 17)
    EndIf

    Run(@ComSpec & " /c " & 'start "Anderer Server" /MAX anderer_server.exe', "", @SW_MAXIMIZE )
    $Anderer_status = GUICtrlCreateLabel("started", 395, 224, 50, 17)
    EndIf
    refresh()
    Case $start_stop_noch_ein_anderer_server
    GUICtrlDelete($noch_ein_anderer_server_status)
    if ProcessExists("noch_ein_anderer_server") Then
    If WinExists("Anderer Server") Then
    WinClose("Anderer Server")
    EndIf
    If WinExists("noch_ein_anderer_server") Then
    WinClose("noch_ein_anderer_server")
    EndIf
    $noch_ein_anderer_server_status = GUICtrlCreateLabel("not started", 160, 224, 50, 17)
    ElseIf NOT ProcessExists("noch_ein_anderer_server") Then
    IF NOT ProcessExists("mysqld.exe") Then
    Run(@ComSpec & " /c " & 'start "MySQL Server" xampplite\mysql\bin\mysqld --defaults-file=xampplite\mysql\bin\my.cnf --standalone --console', "")
    GUICtrlDelete($MySQL_status)
    $MySQL_status = GUICtrlCreateLabel("started", 395, 40, 50, 17)
    EndIf
    Run(@ComSpec & " /c " & 'start "Anderer Server" noch_ein_anderer_server', "")
    $noch_ein_anderer_server_status = GUICtrlCreateLabel("started", 160, 224, 50, 17)
    EndIf
    refresh()
    Case $refresh
    if ProcessExists("anderer_server.exe") Then
    GUICtrlDelete($Anderer_status)
    $Anderer_status = GUICtrlCreateLabel("started", 395, 224, 50, 17)
    EndIf
    if NOT ProcessExists("anderer_server.exe") Then
    GUICtrlDelete($Anderer_status)
    $Anderer_status = GUICtrlCreateLabel("not started", 395, 224, 50, 17)
    EndIf
    if ProcessExists("noch_ein_anderer_server") Then
    GUICtrlDelete($noch_ein_anderer_server_status)
    $noch_ein_anderer_server_status = GUICtrlCreateLabel("started", 160, 224, 50, 17)
    EndIf
    if NOT ProcessExists("noch_ein_anderer_server") Then
    GUICtrlDelete($noch_ein_anderer_server_status)
    $noch_ein_anderer_server_status = GUICtrlCreateLabel("not started", 160, 224, 50, 17)
    EndIf
    if ProcessExists("apache.exe") Then
    GUICtrlDelete($Apache_status)
    $Apache_status = GUICtrlCreateLabel("started", 160, 40, 50, 17)
    EndIf
    if NOT ProcessExists("apache.exe") Then
    GUICtrlDelete($Apache_status)
    $Apache_status = GUICtrlCreateLabel("not started", 160, 40, 50, 17)
    EndIf
    if ProcessExists("mysqld.exe") Then
    GUICtrlDelete($MySQL_status)
    $MySQL_status = GUICtrlCreateLabel("started", 395, 40, 50, 17)
    EndIf
    if NOT ProcessExists("mysqld.exe") Then
    GUICtrlDelete($MySQL_status)
    $MySQL_status = GUICtrlCreateLabel("not started", 395, 40, 50, 17)
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    EDIT: danke @ teh_hahn, ich werd mir das mal ansehen, ist allerdings sehr advanced für mich, der nach möglichkeit auf scripte verzichtet und AutoIT in letzter zeit kaum verwendet hat

    EDIT BugFix: Bitte, bitte: Spoiler setzen. (Hiermit getan.)

    Einmal editiert, zuletzt von TheJoker89 (23. Oktober 2007 um 21:49)

  • Sleep(500) aus der While 1-Schleife raus!. Du bist im MessageLoop-Modus, jedes Sleep unterbricht die Abfrage der GUI und ist ohnehin überflüssig!

    EDIT: Achso, dazu die Funktion refresh mit einem Timer aufrufen (siehe mein Skript oben!).

    Einmal editiert, zuletzt von teh_hahn (23. Oktober 2007 um 21:52)

  • jo, danke nochmal für dein script, bin gerade dabei das zu zerlegen und ein paar sachen nachzulesen in der help (englisch for the world :D)

    edit: wow dein script ist so sau gut lesbar, dafür bewundere ich dich, versuche jetzt es selber lesbarer zu machen bei mir :)

    Einmal editiert, zuletzt von TheJoker89 (23. Oktober 2007 um 21:59)