Startseite › Foren › Deutsches LiveCode-Forum › repeat forever Schleife über Button beenden
- Dieses Thema hat 10 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 4 Jahren, 7 Monaten von Klaus Major.
-
AutorBeiträge
-
-
März 4, 2020 um 22:23 Uhr #19424
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 mouseUpDas Skript für den Beende-Button:
on mouseUp pMouseButton
put true into global_var
end mouseUpKann mir jemand erklären, wieso dass das nicht funktioniert? Natürlich bin ich auch an anderen Lösungen interessiert.
Danke schon mal im Voraus.
-
März 4, 2020 um 22:35 Uhr #19426
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
-
März 4, 2020 um 22:38 Uhr #19427
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
-
-
März 4, 2020 um 23:03 Uhr #19430
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.
-
März 5, 2020 um 10:53 Uhr #19437
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
-
März 5, 2020 um 14:51 Uhr #19442
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 -
März 5, 2020 um 15:01 Uhr #19443
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 ...
-
März 5, 2020 um 15:32 Uhr #19444
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 -
März 5, 2020 um 15:48 Uhr #19446
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… 😎
-
März 5, 2020 um 15:54 Uhr #19448
Hallo Klaus,
danke für die wertvolle Information
Gruß
pit -
März 5, 2020 um 16:18 Uhr #19449
Leider sind viel der Lektionen von Livecode selber, ebenso schlamp.. ähm. salopp programmiert…
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.