Warum lässt sich mein Programm nicht schließen ?

  • hallo, ich möchte mir gerne ein Programm schreiben, dass mir alle paar sekunden eine zahl zwischen 10-1000 raussucht und anzeigt. Das mit der Zahl funktioniert schon super, allerdings lässt sich das Programm dann nichtmehr schließen...

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    $i = Random(10,1000,1)
    GUICtrlSetData($Zahl, $i)
    Sleep(10000)
    WEnd


    wenn ich den sleep auf z.b. 10 einstelle, kann ich das programm mit "schließen" beenden. aber sobald ich es auf eine zahl stelle, bei der man die zufallszahlen auch noch lesen kann, funktioniert das beenden nichtmehr durch das "X" rechts oben am fenster.

    weiß einer von euch warum dies so ist ? ^^

    mfg

  • In einer Schleife mit GuiGetMsg hat sleep nichts zu suchen! Die Message könnte dadurch verloren gehen, was bei dir ja offensichtlich der Fall ist. Nimm statt sleep entweder:

    • eine Kombination aus TimerInit und TimerDiff.
    • AdlibRegister

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (10. Februar 2016 um 21:14)

  • Würde auch mit TimerInit/TimerDiff in der Schleife funktionieren:


    schöner ist allerdings AdlibRegister:

    Einmal editiert, zuletzt von autoBert (10. Februar 2016 um 22:59)

  • @autoBert
    Vielen dank :) damit klappts genauso wie ich es mir vorgestellt habe.

    @CentuCore
    komischer weise funktioniert er einfach garnicht mehr^^ ich bin auch davon ausgegangen, dass er nach den 10 seks reagiert.

    @Kanashius
    Hast recht ;) hab es in einer externen Funktion auch schon ausprobiert, da lief es auch nicht.

  • Naja. in den 10 Sekunden geht das Signal verloren. GuiGetMsg-Events sind nur ne bestimmte Zeit dort, danach verschwinden sie. liegt daran, dass Events schnell abgearbeitet werden müssen (Windowsintern). Bei GuiRegisterMsg sieht man das an dem netten return am Ende. Dort darf man sich auch nicht lange in der Funktion aufhalten. Daher geht es bei GuiGetMsg verloren (intern wird dann einfach die Windows-Routine weiter ausgeführt).

  • Ich hab erwartet, dass AutoIt die GUI Events einfach buffert, dann läuft intern eine eigene Verarbeitung und GuiGetMsg() nur das erste Event in dem Buffer zurückgibt.
    Die GuiRegisterMsg()-Events dagegen werden direkt aufgerufen.
    Tja so kann man sich irren.