Einen neuen Process starten in Purebasic

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Einen neuen Process starten in Purebasic

Beitrag von funkheld »

Wert vom Thread zurückgeben ?
In der Beschreibung steht, es kann kein Wert vom Thread zurückgegeben werden.
---------------------------
Erstellt einen neuen Thread, welcher im Hintergrund der Applikation läuft. Wenn der Thread korrekt erstellt wurde, wird die 'Thread' Nummer zurückgegeben, welche zusammen mit den anderen Befehlen, wie KillThread(), PauseThread(), etc..., benutzt wird. Die Prozedur, welche Sie als ein Thread verwenden, muss einen Parameter haben und kann nichts zurückgeben. Das '*Wert' Argument von CreateThread() wird als Parameter an die Prozedur übergeben. Wenn Sie versuchen, von Ihrem Thread aus einen Wert zurückzugeben, wird dieser einfach verloren gehen.
---------------------------

Aber hier geht es doch:

Code: Alles auswählen

Global wert.l
  Procedure PrintStuff(*Interval)
      PrintN("test")
      wert=10
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@PrintStuff(), 500)
    Delay(100)
    PrintN(Str(wert))
    PrintN("Druecken Sie Return zum Beenden")
    Input()
    CloseConsole()
  EndIf
  End
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Einen neuen Process starten in Purebasic

Beitrag von RSBasic »

In der PB-Hilfe findest du drei Beispielcodes zu Threads.

Bezüglich deines Codes: CreateThread() gibt eine Threadnummer zurück.
Das, was du machst, ist kein Rückgabewert. Du hast einfach nur eine globale Variable, die du im Thread setzt und die du danach außerhalb abfragst. Das hat aber nichts mit dem Rückgabewert zu tun.
Da ein Thread unabhängig im Hintergrund läuft, ist ein Rückgabewert auch nicht erforderlich oder sinnvoll oder machbar.
Über eine globale Variable kannst du das aber auch machen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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: Einen neuen Process starten in Purebasic

Beitrag von NicTheQuick »

RSBasic hat geschrieben:Da ein Thread unabhängig im Hintergrund läuft, ist ein Rückgabewert auch nicht erforderlich oder sinnvoll oder machbar.
Was aber nicht stimmt. In vielen Programmiersprachen gibt es dafür die Funktion 'join()'. Sie funktioniert eigentlich wie 'WaitThread()'. Sie wartet darauf, dass der Thread sich beendet und gibt dann den Rückgabewert des Threads an den aufrufenden Thread zurück. Den Wunsch habe ich glaube ich schon mal im englischen Forum geäußert. Alternativ hab ich mir eine eigene Include für Linux gebaut, die das kann.

Hier ein Beispiel wie es gehen könnte. Wenn man was anderes als Strings nutzen möchte, muss man das Macro 'ThreadResultType' entsprechend ändern.

Code: Alles auswählen

DeclareModule ThreadEx
	Macro ThreadResultType
		s
	EndMacro
	
	Declare.i __CreateThread(*proc, parameter.i)
	Declare.ThreadResultType __WaitThread(threadID.i)
	
	Macro CreateThreadEx(proc, parameter)
		__CreateThread(proc, parameter)
	EndMacro
	
	Macro WaitThreadEx(threadID)
		__WaitThread(threadID)
	EndMacro
EndDeclareModule

Module ThreadEx
	Prototype.ThreadResultType ThreadProc(parameter.i)
	
	Structure ThreadData
		id.i
		parameter.i
		result.ThreadResultType
		proc.ThreadProc
	EndStructure
	
	Procedure Thread(*threadData.ThreadData)
		*threadData\result = *threadData\proc(*threadData\parameter)
	EndProcedure
	
	Procedure __CreateThread(*proc, parameter.i)
		Protected *threadData.ThreadData = AllocateStructure(ThreadData)
		*threadData\parameter = parameter
		*threadData\proc = *proc
		*threadData\id = CreateThread(@Thread(), *threadData)
		ProcedureReturn *threadData
	EndProcedure
	
	Procedure.ThreadResultType __WaitThread(*threadData.ThreadData)
		WaitThread(*threadData\id)
		Protected result.ThreadResultType = *threadData\result
		FreeStructure(*threadData)
		ProcedureReturn result
	EndProcedure
EndModule

UseModule ThreadEx

Procedure.s MyThread(*dummy)
	Delay(1000)
	ProcedureReturn "heyho"
EndProcedure

Define threadId.i = CreateThreadEx(@MyThread(), 0)

Debug threadId

Debug WaitThreadEx(threadId)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Einen neuen Process starten in Purebasic

Beitrag von RSBasic »

@NicTheQuick
Interessanter Code, aber ist der Vorteil für die unabhängige Hintergrundausführung des Vorgangs nicht gleich zerstört?
Vorteil des Threads ist es ja, dass nach dem Starten des Threads weiter ausgeführt wird und eben nicht auf den Thread gewartet wird. Sonst kann man ja auch gleich eine normale Prozedur nehmen. In dem Fall müsste man einen Thread in einem zusätzlichen Thread ausführen, der vom Main-Thread unabhängig läuft.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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: Einen neuen Process starten in Purebasic

Beitrag von NicTheQuick »

Manchmal startet man 64 Threads gleichzeitig, z.B. wenn jeder einen anderen Teil eines Bildes berechnet. Am Ende wartet das Hauptprogramm auf die Beendigung aller Threads und führt die Rückgabewerte zu einem Bild zusammen. Ein ThreadPool zusammen mit eine ConcurrentQueue macht aber meistens mehr Sinn.
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Einen neuen Process starten in Purebasic

Beitrag von mk-soft »

Erst mal den oder die Threads zum laufen bringen

Habe irgendwann mal ein einfaches Beispiel geschrieben.
http://www.purebasic.fr/english/viewtop ... 12&t=64084

:wink:

P.S. Wenn auch noch zwischen den Thread und den Hauptprogramm (Fenster) kommuniziert werden soll,
dann schau mal nach SendEvent...

http://www.purebasic.fr/german/viewtopi ... =8&t=26219
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Einen neuen Process starten in Purebasic

Beitrag von funkheld »

Hallo, guten Tag.

Können Threads eigene Grafikfenster(screens) haben für eine Grafikausgabe auf dem Hauptwindows vom Programm?

Danke.
Gruss
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Einen neuen Process starten in Purebasic

Beitrag von RSBasic »

Fenster haben mit Threads nichts zu tun.
Du kannst beliebig viele Fenster erstellen und die Threads können darauf zugreifen.
Aber bitte aufpassen, dass mehrere Threads nicht gleichzeitig auf dieselbe Ressource zugreifen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Einen neuen Process starten in Purebasic

Beitrag von mk-soft »

Mit Threads Windows und Gadgets erstellen geht nicht einwandfrei. Diese müssen im Hauptprogramm erstellt werden.
Unter Windows kann man auf vorhandene Windows und Gadgets zugreifen.

Unter Linux und Mac führt auch dieses zu Problemen.

Wie man das Problem umgehen kann werde ich mal nachher ein Beispiel proggen...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten