Seite 1 von 2
Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 10.12.2009 16:41
von Chef Wiggum
Hallo,
Ich habe folgendes Problem. Kann sein dass ich gerade einfach nur ein Brett vorm Kopf hab und die Lösung auf der Hand liegt :
Ich habe eine Endlosschleife die per Select auf ein Event wartet. Tritt Event1 ein, so soll Prozedur1 aufgerufen werden. Diese besteht aus einer Repeat-Until X=0 - Schleife und soll durch den Aufruf von Event2(X wird 0 gesetzt) beendet werden. Allerdings stoppt die Prozedur1 ja an der Stelle wo Prozedur1 aufgerufen wurde und wartet bis diese durchlaufen ist. So kann die Schleife nicht darauf reagieren wenn Event2 eintritt welches die Schleife aus Prozedur1 und so Prozedur1 abschließen würde.
Code: Alles auswählen
Global lLoop.l = 0
Repeat
Select EventX
Case Event1
lLoop = 1
Prozedur1() ;Hier bleibt die Schleife stehen und wartet bis Prozedur1 durchlaufen ist und kann nicht mehr auf events reagieren
Case Event2
lLoop = 0
EndSelect
ForEver
Procedure Prozedur1()
Repeat
XXX
Until lLoop = 0
EndProcedure
Ich hoffe Ihr versteht wo mein Problem liegt.
Danke und Grüße
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 10.12.2009 16:50
von helpy
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 10.12.2009 16:55
von NicTheQuick
Im Grunde müsstest du 'Prozedur1()' als Thread ausführen. Schau dir dazu in der Hilfe mal die Beispiele an, dann muss ich auch nicht so viel erklären. ^^
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 10.12.2009 17:02
von TomS
Warum denn Threads?
Also wenn das Beispiel dein Programm beschreibt und nicht irgendwie aus den Fingern gesaugt ist, würde ich das so machen.
Code: Alles auswählen
Procedure Prozedur1()
XYZ ;Kein Repeat in der Schleife
EndProcedure
Repeat
Select Event
Case 1
Loop = 1
Case 2
Loop = 0
Default
If Loop = 1
Prozedur1()
Endif
EndSelect
ForEver
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 10.12.2009 17:39
von Chef Wiggum
Ersteinmal ein dickes Danke für die Antworten. Ich hatte schon mal was gegoogelt und war da auch auf Threads gestoßen, hatte jedoch gehofft darauf verzichten zu können.
@ TomS
Aber der Inhalt der Repeat->Until -Schleife soll ja eben so oft wiederholt werden, bis lLoop durch Eintreteten von Event2 den Wert 0 zugeteilt bekommt. So wie Du es geschrieben hattest, würde der Code ja nur einmal ausgeführt werden.
Danke und Grüße
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 10.12.2009 17:43
von STARGÅTE
ne, denn wenn ein Event "Loop = 1" setzt leibt es ja 1 und dann wird es immer ausgeführt wenn es kein Event gabt und das ist dann auch eine Schleife, nur das beide zusammen ein Kopf haben
deine procedure müsstest du dann ggf. anpassen.
Das ist jedoch nur sinnvoll wenn es eine Zeitintensive Procedure ist.
In der procedure musst du dann auch sagen wann Loop wieder 0 wird
Edit: das war quark!
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 10.12.2009 17:48
von TomS
Möglicherweise muss man den Prozedur-Aufruf außerhalb des Select-Blocks setzen.
In diesem Beispiel auf jeden Fall, da der Select-Block noch von einer If-Abfrage umgeben ist.
Code: Alles auswählen
Procedure Prozedur1()
Debug "Code aus der Prozedur wird ausgeführt"
EndProcedure
OpenWindow(0,0,0,400,400,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(1,5,5,390,180,"LOOP = 1")
ButtonGadget(2,5,200,390,180,"LOOP = 0")
Repeat
event=WindowEvent()
If event=#PB_Event_Gadget
Select EventGadget()
Case 1
Loop = 1
Case 2
Loop = 0
EndSelect
EndIf
If Loop = 1
Prozedur1()
EndIf
Delay(10)
Until event=#PB_Event_CloseWindow
//EDIT:
STARGÅTE hat geschrieben:Das ist jedoch nur sinnvoll wenn es eine Zeitintensive Procedure ist.
In der procedure musst du dann auch sagen wann Loop wieder 0 wird
Hä? Wenn die Prozedur zeitintensiv ist, dann bieten sich doch eher Threads an, da ansonsten ja das Hauptprogramm aufgehalten wird. Wenn die Prozedur z.B. 2 Sekunden braucht, dann muss immer 2 Sekunden gewartet werden, bevor eine Eingabe registriert wird.
Und wieso muss die Abfrage
If Loop=0 in der Prozedur stehen? Geht doch auch wenn's außerhalb steht. Siehe mein Beispiel.
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 10.12.2009 17:54
von STARGÅTE
Jo mein Zweiter absatz war falsch überlegt ^^ (hatte eine andere Überlegung im Kopf) nicht weiter beachten ^^
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 11.12.2009 21:52
von NicTheQuick
Wichtig wäre vielleicht noch zu erwähnen, dass man dann auch nicht 'WaitWindowEvent()' nehmen sollte, sondern nur 'WindowEvent()'.
Re: Schleife bleibt stehen und muss auf Prozedurende warten
Verfasst: 11.12.2009 22:01
von Kaeru Gaman
NicTheQuick hat geschrieben:Wichtig wäre vielleicht noch zu erwähnen, dass man dann auch nicht 'WaitWindowEvent()' nehmen sollte, sondern nur 'WindowEvent()'.
auch falsch!
man sollte
WaitWindowEvent(TimeOut) verwenden.
bitte nicht zwei Jahre alte Krücken empfehlen.