PureBoard
https://www.purebasic.fr/german/

Variable an einen Thread übergeben und wenn fertig abfragen
https://www.purebasic.fr/german/viewtopic.php?f=16&t=31580
Seite 1 von 2

Autor:  Sommertv [ 12.07.2019 19:18 ]
Betreff des Beitrags:  Variable an einen Thread übergeben und wenn fertig abfragen

Hallo,
ich habe eine Stringliste (mehrere Videodateien) die ich an einen Thread zur Bearbeitung übergeben möchte.
Innerhalb der Threadprozedur arbeitet ffmpeg, der die Datei in ein anderes Format umwandelt, was natürlich eine Weile dauert.
Die Umwandlung innerhalb meiner Thread Routine arbeitet soweit korrekt, die zu bearbeitende Datei ist aber im Thread definiert, das geht so überhaupt net... Ich schaff es nicht vom Hauptprogramm einen String an die Thread Routine zu übergeben.
Ausserdem soll mir die Threadprozedur mit einer Variable (UmwOK) mitteilen, dass die Umwandlung abgeschlossen ist, damit ich weiss dass ich die nächste Datei übergeben kann. Die Threadprozedur würde ich innerhalb der Hauptschleife mit Hilfe eines Timers kontinuierlich abfragen.
In einem weiteren Ausbau plane ich noch das Ausgabeformat zu übergeben, aber das wär dann nimmer schwierig, wenn ich das Hauptproblem gelöst hätte.
Wie muss ich das angehen?

Dank im Voraus
Kurt

Autor:  Mijikai [ 12.07.2019 19:44 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

Entweder ein Event (für Wait/WindowEvent) vom Thread senden sobald dieser fertig ist
(um den nächsten Thread zu starten) oder eine Variable/Struktur (auch kontinuierlich)
abfragen die dann mit Lock/UnlockMutex gesichert sein sollte.
Über so einer abgesicherte Variable/Struktur können dann auch neue Befehle
usw. übergeben werden.

Autor:  STARGÅTE [ 12.07.2019 20:20 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

Sommertv hat geschrieben:
Die Umwandlung innerhalb meiner Thread Routine arbeitet soweit korrekt, die zu bearbeitende Datei ist aber im Thread definiert, das geht so überhaupt net... Ich schaff es nicht vom Hauptprogramm einen String an die Thread Routine zu übergeben.Ausserdem soll mir die Threadprozedur mit einer Variable (UmwOK) mitteilen, dass die Umwandlung abgeschlossen ist, damit ich weiss dass ich die nächste Datei übergeben kann.

Dafür sind Semaphore da:
CreateSemaphore(), SignalSemaphore(), TrySemaphore() und WaitSemaphore().
Genauer gesagt brauchst du zwei davon.
Das eine Semaphore wartet (Wait) im Thread auf ein Signal, ob eine neue Datei (String) gelesen werden darf.
Nach der Bearbeitung sendet (Signal) der Thread selbst ein Signal eines anderen Semaphore das er fertig ist.
Im Hauptprogramm prüftst (Try) du dann ob es ein Signal vom Thread gab und arbeitest weiter.

Autor:  NicTheQuick [ 12.07.2019 20:38 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

Eigentlich benutzt man für das, wovon Stargate redet, sogar Condition Variables, leider gibt es die in PB nicht.

Autor:  Sommertv [ 12.07.2019 23:04 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

Danke... das hat mir schon sehr viel weiter geholfen. Ich hab jetzt in etwa folgenden Code, aber der funktioniert noch nicht korrekt, heisst ich kann zwar damit einen String an den Thread übergeben, aber der Rückgabewert im OkFlag ist immer 0.
Wo kann der Fehler liegen?
Code:
Structure VideoConvert
FileName$
EndFlag$
EndStructure

Procedure MyThread(*Parameters.VideoConvert)
    Define *OkFlag
    *OkFlag = AllocateMemory(1) 
    Debug *Parameters\FileName$
    Debug *Parameters\EndFlag$

; hier der Aufruf von ffmpeg mit RunProgram...

    ClearStructure(*Parameters, VideoConvert)
    FreeMemory(*Parameters)
    PokeI (*OkFlag,1) 
  EndProcedure

  *Parameters.VideoConvert = AllocateMemory(SizeOf(VideoConvert))
  *Parameters\FileName$ = "blablabla.mov"
  *Parameters\EndFlag$ = "0"
 
  Delay(2000)
 
Debug "OkFlag= " + *OkFlag
Repeat
  Delay(1)
ForEver

Autor:  #NULL [ 13.07.2019 07:46 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

*OkFlag ist eine lokale Variable der Procedure und außerhalb nicht sichtbar. Wäre auch schlecht da sie nicht mit Mutex o.d.g. gesichert ist.

Autor:  Sommertv [ 13.07.2019 08:45 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

Guten Morgen,
ok... das leuchtet mir ein, iss mein Fehler...
Wie kann ich dann einen Rückgabestring an EndFlag$ übergeben?
Code:
PokeS(*Parameters\EndFlag$,"fertig",10, #PB_Ascii)

funktioniert nicht, da bekomme ich die Meldung Bad Parameter Type...

Autor:  Demivec [ 13.07.2019 09:52 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

Sommertv hat geschrieben:
Guten Morgen,
ok... das leuchtet mir ein, iss mein Fehler...
Wie kann ich dann einen Rückgabestring an EndFlag$ übergeben?
Code:
PokeS(*Parameters\EndFlag$,"fertig",10, #PB_Ascii)

funktioniert nicht, da bekomme ich die Meldung Bad Parameter Type...

Code:
*Parameters\EndFlag$ = "fertig"

Autor:  mk-soft [ 13.07.2019 10:40 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

So geht es recht einfach...

Ich habe es mal zu einen Mini-Thread-Control umgebaut

Link: Mini Thread Control

Autor:  Sommertv [ 13.07.2019 21:54 ]
Betreff des Beitrags:  Re: Variable an einen Thread übergeben und wenn fertig abfra

Danke schön,
das ist ein schönes ausbaufähiges Beispiel...

Schöne Grüsse
Kurt

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/