Seite 2 von 2
Re: Einen neuen Process starten in Purebasic
Verfasst: 13.04.2016 13:50
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
Re: Einen neuen Process starten in Purebasic
Verfasst: 13.04.2016 13:59
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.
Re: Einen neuen Process starten in Purebasic
Verfasst: 13.04.2016 14:31
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)
Re: Einen neuen Process starten in Purebasic
Verfasst: 13.04.2016 14:55
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.
Re: Einen neuen Process starten in Purebasic
Verfasst: 13.04.2016 15:02
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.
Re: Einen neuen Process starten in Purebasic
Verfasst: 13.04.2016 19:58
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
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
Re: Einen neuen Process starten in Purebasic
Verfasst: 18.04.2016 14:36
von funkheld
Hallo, guten Tag.
Können Threads eigene Grafikfenster(screens) haben für eine Grafikausgabe auf dem Hauptwindows vom Programm?
Danke.
Gruss
Re: Einen neuen Process starten in Purebasic
Verfasst: 18.04.2016 15:04
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.
Re: Einen neuen Process starten in Purebasic
Verfasst: 18.04.2016 16:41
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...