Gui mit Schleife - Buttons funktionieren nicht

  • Hallo,
    ich habe mir ein kleines Überwachungsscript für meinen Printserver geschrieben welches mir alle 2 Sekunden die Anzahl der Dateien ausgibt die in drei Verzeichnissen liegen.
    Ich habe jetzt nur ein Problem
    Entweder klappt das Zählen, dann funktionieren meine Buttons aber nicht,
    oder Buttons funktionieren - dann klappt das Zählen aber nur einmal.

    Hier kommt mal die Version wo das Zählen Funktioniert (die wichtigere Funktion).
    Kann mir einer eine Tip geben wie ich es Hinbekommen das der die Ordner alle 2 Sekunden aktualisiert und die Buttons trotzdem funktionieren ?

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <process.au3>
    #include <array.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Spoolcheck", 289, 85, 196, 152)
    $Label1 = GUICtrlCreateLabel("Dateien im Spoolverzeichnis", 3, 8, 137, 17)
    $Data1 = GUICtrlCreateLabel("Data1", 157, 8, 33, 17)
    $Button1 = GUICtrlCreateButton("öffnen", 206, 4, 75, 20)
    $Label2 = GUICtrlCreateLabel("Dateien in Windows\Temp", 3, 30, 131, 17)
    $Data2 = GUICtrlCreateLabel("Data2", 157, 29, 33, 17)
    $Button2 = GUICtrlCreateButton("öffnen", 206, 26, 75, 20)
    $Label3 = GUICtrlCreateLabel("Dateien in RETRY", 3, 52, 131, 17)
    $Data3 = GUICtrlCreateLabel("Data3", 157, 50, 33, 17)
    $Button3 = GUICtrlCreateButton("öffnen", 206, 48, 75, 20)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Zaehlen()

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

    While 1

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    ShellExecute("EXPLORER", "C:\Windows\System32\spool\PRINTERS")
    Case $Button2
    ShellExecute("EXPLORER", "C:\Windows\temp")
    Case $Button3
    ShellExecute("EXPLORER", "D:\Proforma\Proforma\retry")

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

    EndSwitch

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

    Wend

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

    WEnd

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

    Func Zaehlen()

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

    $size1 = DirGetSize("C:\Windows\System32\spool\PRINTERS\",1)
    $size2 = DirGetSize("C:\Windows\TEMP\",1)
    $size3 = DirGetSize("D:\Proforma\Proforma\retry",1)

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

    If IsArray($size1) Then
    GUICtrlSetData($Data1,$size1[1])
    EndIf

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

    If IsArray($size2) Then
    GUICtrlSetData($Data2,$size2[1])
    EndIf

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

    If IsArray($size3) Then
    GUICtrlSetData($Data3,$size3[1])
    EndIf

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

    GUISetState()
    Sleep(2000)

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

    EndFunc

    [/autoit]

    Gruß
    Wolke

    Einmal editiert, zuletzt von wolkenloser (30. Oktober 2012 um 09:42)

  • Hi,
    Ich habe nochmal rumprobiert.
    Mit der While Schleife in der Whileschliefe funktioniert es zwar, aber die CPU Last ist für so einen Miniprozess sehr hoch.
    Es funktioniert übrigens nicht wenn der Sleep Befehl in der Funktion steht, so als wenn er dann da nicht mehr raus kommt ?!?

    Was dann auch noch ein unschöner Effekt ist: die Zahlen flackern die ganze Zeit als wenn die Funktion andauernd aufgerufen wird ohne den Sleepbefehl durchzuführen.

    Wenn noch jemand eine zündende Idee hat wäre ich dankbar :)


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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <process.au3>
    #include <array.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Spoolcheck", 289, 85, 196, 152)
    $Label1 = GUICtrlCreateLabel("Dateien im Spoolverzeichnis", 3, 8, 137, 17)
    $Data1 = GUICtrlCreateLabel("Data1", 157, 8, 33, 17)
    $Button1 = GUICtrlCreateButton("öffnen", 206, 4, 75, 20)
    $Label2 = GUICtrlCreateLabel("Dateien in Windows\Temp", 3, 30, 131, 17)
    $Data2 = GUICtrlCreateLabel("Data2", 157, 29, 33, 17)
    $Button2 = GUICtrlCreateButton("öffnen", 206, 26, 75, 20)
    $Label3 = GUICtrlCreateLabel("Dateien in RETRY", 3, 52, 131, 17)
    $Data3 = GUICtrlCreateLabel("Data3", 157, 50, 33, 17)
    $Button3 = GUICtrlCreateButton("öffnen", 206, 48, 75, 20)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1

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

    while 1
    Zaehlen()
    ExitLoop
    Sleep (2000)
    WEnd

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    ShellExecute("EXPLORER", "C:\Windows\System32\spool\PRINTERS")
    Case $Button2
    ShellExecute("EXPLORER", "C:\Windows\temp")
    Case $Button3
    ShellExecute("EXPLORER", "D:\Proforma\Proforma\retry")

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

    EndSwitch

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

    WEnd

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

    Func Zaehlen()

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

    $size1 = DirGetSize("C:\Windows\System32\spool\PRINTERS\",1)
    $size2 = DirGetSize("C:\Windows\TEMP\",1)
    $size3 = DirGetSize("D:\Proforma\Proforma\retry",1)

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

    If IsArray($size1) Then
    GUICtrlSetData($Data1,$size1[1])
    EndIf

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

    If IsArray($size2) Then
    GUICtrlSetData($Data2,$size2[1])
    EndIf

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

    If IsArray($size3) Then
    GUICtrlSetData($Data3,$size3[1])
    EndIf
    GUISetState()

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

    EndFunc

    [/autoit]

    Gruß
    Wolke

    Einmal editiert, zuletzt von wolkenloser (30. Oktober 2012 um 08:35)

  • Das mit dem Sleep ist ja logisch...die anderen If-Abfragen sowie die Buttonpresses laufen so schnell durch, das man danach praktisch nur noch den Sleep merkt. Er kommt nicht nicht mehr raus, aber du müsstest sehr viel glück haben wenn du den Button im aktiven Zustand erwischst.
    Ein Sleep in einer While-schlaufe mit buttons ist generell tabu.
    Die Funktion solltest du vieleich mit einem Zähler daran hindern können zu flackern (also wenn was verändert wurde zähler von 0 auf 1 ändern je nachdem wie er gesetzt wurde. Wenn das nächste mal eine Änderung vorgenommen wird dann einfach wieder zurücksetzen.
    Naja so zumindest die Theorie...ich hab irgendwo noch ein Beispiel rumliegen

    Bild1: Ich beim debuggen

  • Mach mal vor die Schleife:

    [autoit]

    AdlibRegister("Zaehlen", 1000)

    [/autoit]

    und entferne:

    [autoit]

    while 1
    Zaehlen()
    ExitLoop
    Sleep (2000)
    WEnd

    [/autoit]

    Da flackert nix mehr und der CPU gehts auch gut *G*

  • Deine Prozessorlast möcht ich nicht haben ^^

    Why? Das macht ja keinen Sinn wenn du alle 2 Sekunden für eine Hundertstelsekunde abfragst ob der Button gedrückt ist ö.Ö
    Ausserdem wenn gerade mal eine GUI offen ist, dann wird sich mein Proz. nicht gleich in die Hosen machen ^^

    Bild1: Ich beim debuggen