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
        Administrator

          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
              Administrator

                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
                  Administrator

                    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
                      Administrator

                        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
                          Administrator

                            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.