repeat forever Schleife über Button beenden

Startseite Foren Deutsches LiveCode-Forum repeat forever Schleife über Button beenden

Ansicht von 9 Antwort-Themen
  • Autor
    Beiträge
    • #19424
      livecode_pit
      Teilnehmer

      Hallo,

      ich habe einen Stack mit einem Button zum Beenden einer repeat forever Schleife. Ich habe dazu eine globale Variable definiert, die für den Abbruch der forever-Schleife abgefragt wird. Wenn ich auf den Button drücke, soll diese globale Variable auf true gesetzt werden, damit der exit in der Schleife greift.

      Leider passiert beim Drücken des Buttons nichts, beim Debuggen sieht man auch keine Änderung der globalen Variablen, die Schleife läuft einfach weiter.

      Das Skript im Stack:

      global global_var

      on mouseUp pButtonNumber
      put false into global_var
      repeat forever
      beep
      if global_var = true then
      exit repeat
      end if
      end repeat
      end mouseUp

      Das Skript für den Beende-Button:

      on mouseUp pMouseButton
      put true into global_var
      end mouseUp

      Kann mir jemand erklären, wieso dass das nicht funktioniert? Natürlich bin ich auch an anderen Lösungen interessiert.

      Danke schon mal im Voraus.

    • #19426
      Klaus Major
      Verwalter

      Hi Pit,

      willkommen im Forum!

      Bitte nach dem Einfügen enes Skriptes selbiges in die CODE Tags packen, dann bleibt die Formatierung erhalten!

      OK, wenn Du der Engine keine Zeit zum „luftholen“ gibt, wir ein REPEAT Loop ewig laufen, es sein denn Du fügest eine entpsrechende Zeile hinzu:

      global global_var
      
      on mouseUp pButtonNumber
        put false into global_var
        repeat forever
         beep
         
         ## Hier einfügen:
         wait 0 with messages
         ## !!!
      
         if global_var = true then
           exit repeat
         end if
        end repeat
      end mouseUp

      Wuichtig:
      Auch musst Du in jedem Skript GLOABLE Variabeln deklarieren, in dem Du sie verwenden willst:
      Also so:

      global global_var
      
      on mouseUp pMouseButton
        put true into global_var
      end mouseUp

      Gruß

      Klaus

      • #19427
        matthiasr
        Teilnehmer

        Und Du könntest das Ganze noch ein bisschen verschlanken

        on mouseUp pButtonNumber
        put false into global_var
        repeat until global_var is true
        beep

        ## Hier einfügen:
        wait 0 with messages
        ## !!!

        end repeat
        end mouseUp

    • #19430
      livecode_pit
      Teilnehmer

      Hallo Klaus,

      danke für die Antwort. Die globale Variable hatte ich auch im Skript des Buttons, ist mir beim reinkopieren aber verloren gegangen.

      Ich habe die wait-Zeile eingebaut, es gab aber leider keine Änderung des Verhaltens.
      Du hattest geschrieben, die Engine hatte keine Zeit zum Luftholen, das ist mir nicht klar, ich habe doch den beep-Befehl in der Schleife, das müsste doch reichen, oder verstehe ich da was nicht?

      Was bewirkt eigentlich ein wait 0? Ich kenne wait 1 seconds, das habe ich auch ausprobiert, leider auch ohne Verbesserung.

    • #19437
      Klaus Major
      Verwalter

      Hi Pit,

      hm, das mit „wait 0“ sollte eigentlich reichen!?
      Das BEEP ist Teil des Loops, daher reicht das leider nicht aus.

      Das „wait 0“ ist in dem Sinne der Befehl zum „Luftholen“ für die Engine, sie macht aber trotzdem keine Pause im LOOP, sondern kann sich so zusätzlich noch um andere Dinge kümmern.

      Aber eigentlich müsste Dein Skript ein wirklich nervtötendes Maschinengewehrfeuer an BEEPs raushauen, tut es das nicht?

      Was möchtest Du denn genau erreichen? Vielleicht kann man das anders lösen?
      „repeat forever“ oder „repeat until“ birgt immer gewisse Risiken, wie Du hier sehen kannst.

      Gruß

      Klaus

    • #19442
      livecode_pit
      Teilnehmer

      Hall Klaus,

      das Beep dauert relativ lange, seltsam.

      Inzwischen habe ich das Problem mit einem Timer gelöst

      global global_var
      
      on mouseUp pButtonNumber
         init
         schleife 
      end mouseUp
      
      on init
         put false into global_var
      end init
      
      on schleife
         if global_var is true then
            beep
            send schleife to this stack in 100 milliseconds
         end if
      end schleife

      Aber mich würde immer noch interessieren, weshalb das wait in der Schleife nicht funktioniert.
      Und könntest du mir noch ein Beispiel geben, wo das wait 0 sinnvoll einzusetzen ist?

      Danke schon mal im Voraus und Gruß
      pit

    • #19443
      Klaus Major
      Verwalter

      Aber mich würde immer noch interessieren, weshalb das wait in der Schleife nicht funktioniert.

      Tut mir leid, das weiß ich nicht.

      Und könntest du mir noch ein Beispiel geben, wo das wait 0 sinnvoll einzusetzen ist?

      Mir fällt gerade kein Beispiel ein.

      Hinweis:
      Handler, die Du SENDen möchjtest wie einen String in Anführungzeichen setzen!

      ...
      send "schleife" to this stack in 100 milliseconds
      ...
    • #19444
      livecode_pit
      Teilnehmer

      Hallo Klaus,

      laut Dokumentation heisst die Syntax send message…Wieso soll man die message in Anführungszeichen setzen?
      Im Buch von Hauke Fehr werden die Anführungszeichen auch weggelassen.

      Gruß
      pit

    • #19446
      Klaus Major
      Verwalter

      Ja, aber schau Dir im Dictionary die Beispiele an, alle mit Anführungszeichen.
      Und Schande über Hauke! 😀

      Ein Problem ist die Geschwindigkeit!
      Ein String OHNE Anführungszeichen kann alles sein, daher mnuss die Engine erst mal alles überprüfen, bis sie die endgültige Entscheidung trifft, was zu tun ist.

      Dito für Objektnamen:

      ...
      put empty into fld ein_feld
      ...

      Hier sucht die Engine zunächst den gesamten RAM ab, ob es eine VARIABLE mit diesem Namen gibt, wenn nicht, erst dann nimmt sie an, der Entwickler meint einen Handler mit dem Namen.

      Also das hier wird einfach schneller ausgeführt:

      ...
      put empty into fld "ein_feld"
      ...

      Ist hier natürlich nicht spür- sondern nur messbar, aber sowas läppert sich.

      Ein weiterer Grund, ich habe in den letzten 21 Jahren, in denen ich mit LC und seinen Vorfahren arbeite, festgestellt, daß die Engine mit jeder Version weniger rüchsichtsvoll mit „salopper Programmierung“ umgeht.

      Das bedeutet, das, was heute noch so gerade durchgeht, wie Objektnamen oder ein SEND ohne Anführungszeichen, wird möglicherweise deshalb in einer späteren Version einen ERROR abschickt.

      Daher bleibe ich seit Jahren bei der offiziellen Syntax und hatte diesbezüglich daher auch nie Probleme.

      Das ist also nur ein gut gemeinter Rat, den Du aber nicht zu beherzigen brauchst… 😎

    • #19448
      livecode_pit
      Teilnehmer

      Hallo Klaus,

      danke für die wertvolle Information

      Gruß
      pit

    • #19449
      Klaus Major
      Verwalter

      Leider sind viel der Lektionen von Livecode selber, ebenso schlamp.. ähm. salopp programmiert…

Ansicht von 9 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.