Variable an einen Thread übergeben und wenn fertig abfragen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Variable an einen Thread übergeben und wenn fertig abfra

Beitrag von silbersurfer »

Hallo Sommertv,

ich würde dein Beispiel in etwa so gestalten:

Code: Alles auswählen

Structure VideoConvert
	FileName$
	EndFlag$
	OKFlag.i
	thread.i
EndStructure

Procedure MyThread(*Parameters.VideoConvert)
	Debug *Parameters\FileName$
	Debug *Parameters\EndFlag$
	Delay(2000)
	; hier der Aufruf von ffmpeg mit RunProgram...
	*Parameters\OKFlag=1 
EndProcedure

Define Parameters.videoConvert,Ende
Parameters\FileName$ = "blablabla.mov"
Parameters\EndFlag$ = "0"
Parameters\thread=CreateThread(@Mythread(),@Parameters)   
Repeat 
	If Parameters\OKFlag=1
		Debug "Video ist fertig OKFflag="+Str(Parameters\OKFlag)
		Ende=1
	EndIf     
Until Ende=1
oder gleich als Procedure

Code: Alles auswählen

EnableExplicit
Structure VideoConvert
	FileName$
	EndFlag.i
	OKFlag.i
	thread.i
EndStructure
Define Parameters.videoConvert,Ende,Video

Procedure MyThread(*Parameters.VideoConvert)
	Debug *Parameters\FileName$
	;Debug *Parameters\EndFlag
	Delay(2000)
	; hier der Aufruf von ffmpeg mit RunProgram...
	*Parameters\OKFlag=1 
	*Parameters\EndFlag+1
EndProcedure
Procedure StartThread(*this.videoConvert,Video.s)
	With *this
		\FileName$=Video
		\OKFlag=#False 
		\thread=CreateThread(@Mythread(),*this)   
	EndWith	
EndProcedure	


StartThread(Parameters,"Mein Video.mpg")
Repeat 
	If Parameters\OKFlag=1
		Debug "Video ist fertig OKFflag="+Str(Parameters\OKFlag)	
		StartThread(Parameters,"Mein neues Video.mpg")
		If Parameters\EndFlag=2 : Ende=1 : EndIf
	EndIf     
Until Ende=1
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Sommertv
Beiträge: 68
Registriert: 26.04.2019 10:31
Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
Wohnort: Mühldorf am Inn

Re: Variable an einen Thread übergeben und wenn fertig abfra

Beitrag von Sommertv »

Danke,
ich werds durcharbeiten...
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Variable an einen Thread übergeben und wenn fertig abfra

Beitrag von NicTheQuick »

@silbersurfer:
Das ist aber genau die Art und Weise wie man es eben nicht tun soll. Busy Waits sind die falsche Herangehensweise.
Bild
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Variable an einen Thread übergeben und wenn fertig abfra

Beitrag von silbersurfer »

@NicTheQuick
Das ist aber genau die Art und Weise wie man es eben nicht tun soll.
wie meinst du das NicTheQuick mit
Busy Waits sind die falsche Herangehensweise
kannst du mir das mal genauer erklären, bin da jetzt etwas auf dem Holzweg
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Variable an einen Thread übergeben und wenn fertig abfra

Beitrag von NicTheQuick »

"Busy wait" bedeutet, dass du in einer Schleife durchgehend prüfst, ob der Thread das Flag gesetzt hat. Das belastet die CPU unnötig und vernachlässigt deswegen andere Prozesse. Besser ist die Herangehensweise mit PostEvent aus dem Thread heraus oder wenn man gar keine Ereignisschleife nutzt, dann macht man es normalerweise mit Condition Variables oder zumindest Semaphoren. Leider bietet Purebasic nur Semaphoren nativ an.

Mk-softs Mini Thread Control ist effizienter und auch sicherer zu nutzen.

Das ist jetzt nicht böse gemeint, aber bei Threads muss man unheimlich aufpassen. Die falsche Sperrreihenfolge, falsches Signaling, doppeltes Sperren oder Entsperren, eine einzelne ungeschützte Zeile, ... Alles kann dazu führen, dass die meiste Zeit alles richtig läuft, aber es in ganz seltenen Fällen zu Fehlern kommt. Und einfach reproduzierbar sind die meistens nicht, weil es oft mit dem Scheduling des Betriebssystems zusammenhängt oder sogar damit, ob der Nutzer einen SingleCore oder MultiCore hat. Das kann am Ende schon ganz schön verrückt werden. :D Aber wie auch immer, wichtig ist einfach, dass man grundlegende Prinzipien verstanden hat und sie durchgehend anwendet.
Bild
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Variable an einen Thread übergeben und wenn fertig abfra

Beitrag von silbersurfer »

@NicTheQuick
dass du in einer Schleife durchgehend prüfst
jetzt habe ich das verstanden, danke erstmal. Ich selber mach das auch mit Postevent
Nur bei seinen Beispiel war keine Gui eingebunden, weshalb ich das so veranschaulicht habe. Aber du hast natürlich Recht das man bei Thread sehr aufpassen muß was man wie dort übergibt oder abfragt.
Und natürlich bin ich dir nicht böse, ist doch alles zum zwecke des lernen hier.

Code: Alles auswählen

EnableExplicit

Enumeration Window
	#VideoConverter
	#Textausgabe
	#button
EndEnumeration	
Enumeration #PB_Event_FirstCustomValue
	#Datei_Fertig
EndEnumeration	

Structure VideoConvert
   FileName$
   EndFlag.i
   OKFlag.i
   thread.i
EndStructure
Define Parameters.videoConvert,Ende,Video,Event,zahl

Procedure MyThread(*Parameters.VideoConvert)
   Debug *Parameters\FileName$
   Delay(2000)
   ; hier der Aufruf von ffmpeg mit RunProgram...
   *Parameters\OKFlag=1 ;Wenn RunProgram fertig ist Setze #true
   If *Parameters\OKFlag=1 : PostEvent(#Datei_Fertig,#VideoConverter,0) : EndIf 
EndProcedure
Procedure StartThread(*this.videoConvert,Video.s)
   SetGadgetText(#Textausgabe,"Video ist in Bearbeitung !")
   With *this
      \FileName$=Video
      \OKFlag=#False
      \thread=CreateThread(@Mythread(),*this)   
   EndWith   
EndProcedure   
If OpenWindow(#VideoConverter, 0, 0, 400, 200, "VideoConverter",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	TextGadget(#Textausgabe,10,10,380,40,"")
	ButtonGadget(#button,300,170,90,20,"Datei Senden")
EndIf 
Repeat
	Event=WaitWindowEvent()
	Select event 	
		Case #Datei_Fertig	
			SetGadgetText(#Textausgabe,Parameters\FileName$+" ist Fertig")
			;ab hier kann man entscheiden wie es weiter geht z.b
		Case #PB_Event_Gadget	
			Select EventGadget()
				Case #button
					If Not IsThread(Parameters\thread)
						zahl+1	
						StartThread(Parameters,"Mein Video"+Str(zahl)+".mpg")
					Else
						SetGadgetText(#Textausgabe,"Video ist noch nicht Fertig")
					EndIf 	
			EndSelect
		Case  #PB_Event_CloseWindow
			Ende=#True 
	EndSelect		
Until Ende=#True
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Antworten