GUI reagiert nicht auf Buttons evt. wegen Schleife oder Sleep?

  • Guten Tag zusammen,

    ich bin gerade dabei ein kleinen Tool zu bauen, welches alle 5 Minuten einen Screenshot macht und abspeichert.

    Das ganze funktioniert auch prächtig, vielen Dank an alle die an der deutschen Hilfedatei mithelfen <3

    Wenn ich nun aber das Programm über den Button "Programm starten" starte, reagiert er nicht mehr auf die anderen GUI Inhalte, z.B. zum beenden.

    Ich vermute, das hängt mit der Schleife oder eher dem Sleep zusammen.

    Habe dann auch mal versucht, in die Schleife eine Abfrage zu nehmen, ob einer der Buttons geklickt wurde, das hat auch nicht fuktioniert.

    Wie könnte ich das mit der 5 Minuten-Schleife den ohne das Sleep lösen?

    Mein bisheriger Quellcode
  • Das sollte auch nicht überraschen, da GuiGetMsg() die Klicks auf der GUI abfragt und du diese Funktion nicht mehr ausführst.

    Ich rate dir dringend zum OnEventModus, dann hast du das Problem nicht mehr. Solltest aber aufpassen, dass du dabei nicht eine Funktion mehrfach betrittst und in While-Schleifen stecken bleibst.

    Die Hilfe beschreibt beide Modi ganz gut, lies dich da einfach mal durch: https://www.autoitscript.com/autoit3/docs/g…OnEventMode.htm

  • Ich rate dir dringend zum OnEventModus, dann hast du das Problem nicht mehr.

    Der OnEventModus ist auch nicht die einzige Lösung, denn auch hier:

    Solltest aber aufpassen, dass du dabei nicht eine Funktion mehrfach betrittst und in While-Schleifen stecken bleibst.

    wie du ja schon selbst anmerkst.

    elysium: Das Problem kann man auf verschiedenste Arten lösen. Die einfachste dürfte Adlibregister sein, dazu muss nur die

    Code: Func Hunting
    Func Hunting()
        AdlibUnRegister('Hunting')
            ; Erstellt Screenshot - kompletter Bildschirm
            $hBmp = _ScreenCapture_Capture("")
    
            ; Speichert das Bild
            _ScreenCapture_SaveImage(@MyDocumentsDir & "\screenshot.jpg", $hBmp)
        AdlibRegister('Hunting', 5*60*1000)
    EndFunc   ;==>EndeHunting


    angepasst werden.

    mfg (auto-)Bert

  • Hallo alpines,

    vielen Dank für die Hilfe, habe das jetzt versucht so umzuschreiben, leider blockiert es mich immer noch, sobald ich die 5 Minuten-Schleife aufrufe.

    Spoiler anzeigen

    Könntest Du mich eventuell nochmals in die richtige Richtung schubsen?

    Edit: Gerade erst die Antwort von autoBert gesehen, das muss ich erst noch probieren, Danke

  • Erstelle im globalen Scope eine While-Schleife wo du eine bestimmte Bedingung prüfst ($bRunning) und dann setzt du mit Klicks auf Buttons einfach die Variable.

    Etwa so:

  • Die Adlib-Lösung funktioniert natürlich auch im OnEvent-Modus. Hier aber eine andere Lösung:

  • Hallo zusammen, vielen Dank und Sorry für die späte Antwort, hat etwas gedauert mit der Umsetzung.

    Ich habe jetzt alles wieder umgeschrieben, auf die ursprüngliche Variante, damit komme ich irgendwie besser klar und habe dann die Adlib-Lösung genommen.

    Soweit ich das bisher testen konnte, funktioniert alles wie gewünscht und ich bastel jetzt noch an Kleinigkeiten rum.

    Hab den Intervall nun über das GUI veränderbar gemacht und eine Programm-Status Anzeige mit rein gebaut.

    Nur eine Kleinigkeit stört mich noch :|

    Ich habe für das Input Control eine Abfrage drin, dass wenn der Wert kleiner 1 ist, eine MsgBox aufgeht, welche den User darauf hinweist, dass der Wert mindestens 1 Minute sein muss.

    Wie kann ich den Benutzer, wenn der Wert kleiner 1 ist, dann wieder aus der Funktion befördern, in welcher die Abfrage stattfindet?

    Aktuell mache ich das über ExitLoop, allerdings schließt sich dann das gesamte GUI.

    Spoiler anzeigen

    Edit:

    Ich glaub ich habe es geschafft, es tut zumindest das was ich möchte, ob es der richtige Weg ist, keine Ahnung :)

    Spoiler anzeigen
    Code
                If GUICtrlRead($idInput) < 1 Then
                    MsgBox($MB_ICONERROR, "Wert zu klein...", "Der Intervall in Minuten muss mindestens 1 Minute betragen")
                    Break(1)
                Else
                    MsgBox($MB_ICONINFORMATION, "Programm wurde gestartet...", "Programm speichert alle" & GUICtrlRead($idInput) & " Minuten einen Screenshot")
                    Hunting()
                EndIf

    Einmal editiert, zuletzt von elysium (21. Februar 2020 um 10:07)

  • Ok, Sorry für den Doppelpost aber ich glaube, dass ich jetzt fertig wäre mit meinem kleinen Tool.

    Könntet ihr euch eventuell kurz anschauen ob ihr einen groben Fehler findet?

    Besonders würde mich interessieren, ob die Art und Weise, wie ich das Script stoppe, über den "Programm beenden" Button, so richtig ist.

    Habe da mehre Dinge versucht um die Hunting-Funktion zu stoppen, welche alle nicht richtig funktioniert haben.

    Die Lösung jetzt, stoppt zumindest die Screenshot-Erstellung, weiß nur nicht, ob der gewählte Weg auch "gut" ist.

    Spoiler anzeigen
  • Den Wert für das Intervall würde ich beim Setzen prüfen:

    Code
            Case $idInput
                If GUICtrlRead($idInput) < 1 Then
                    MsgBox($MB_ICONERROR, "Wert zu klein...", "Der Intervall in Minuten muss mindestens 1 Minute betragen")
                    GUICtrlSetData($idInput, 1)
                EndIf
            Case $BtnProgrammStarten
                    Hunting()

    Da das Intervall ja auch während das Programm läuft geändert werden kann, würde ich das Label direkt vor dem AdlibRegister aktualisieren:

  • Hallo autoBert,

    vielen Dank für das drüber schauen, war die letzten Tage krank, daher die späte Antwort.

    Werde versuchen das noch umzusetzen und bin froh, dass es so wenig ist :)