Schleife bleibt stehen und muss auf Prozedurende warten

Anfängerfragen zum Programmieren mit PureBasic.
Chef Wiggum
Beiträge: 10
Registriert: 23.08.2008 10:11

Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag 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
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag von helpy »

Da wirst Du wohl um Threads nicht herumkommen.

==> Siehe hier: http://purearea.net/pb/german/manual/thread/index.html
==> oder hier: http://www.purebasic.com/german/documentation/thread/index.html

cu, helpy
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag 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. ^^
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag 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
Chef Wiggum
Beiträge: 10
Registriert: 23.08.2008 10:11

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag 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!
Zuletzt geändert von STARGÅTE am 10.12.2009 17:55, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag von STARGÅTE »

Jo mein Zweiter absatz war falsch überlegt ^^ (hatte eine andere Überlegung im Kopf) nicht weiter beachten ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag von NicTheQuick »

Wichtig wäre vielleicht noch zu erwähnen, dass man dann auch nicht 'WaitWindowEvent()' nehmen sollte, sondern nur 'WindowEvent()'.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten