Seite 1 von 2

Variable an einen Thread übergeben und wenn fertig abfragen

Verfasst: 12.07.2019 19:18
von Sommertv
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

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

Verfasst: 12.07.2019 19:44
von Mijikai
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.

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

Verfasst: 12.07.2019 20:20
von STARGÅTE
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.

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

Verfasst: 12.07.2019 20:38
von NicTheQuick
Eigentlich benutzt man für das, wovon Stargate redet, sogar Condition Variables, leider gibt es die in PB nicht.

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

Verfasst: 12.07.2019 23:04
von Sommertv
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: Alles auswählen

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

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

Verfasst: 13.07.2019 07:46
von #NULL
*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.

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

Verfasst: 13.07.2019 08:45
von Sommertv
Guten Morgen,
ok... das leuchtet mir ein, iss mein Fehler...
Wie kann ich dann einen Rückgabestring an EndFlag$ übergeben?

Code: Alles auswählen

PokeS(*Parameters\EndFlag$,"fertig",10, #PB_Ascii)
funktioniert nicht, da bekomme ich die Meldung Bad Parameter Type...

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

Verfasst: 13.07.2019 09:52
von Demivec
Sommertv hat geschrieben:Guten Morgen,
ok... das leuchtet mir ein, iss mein Fehler...
Wie kann ich dann einen Rückgabestring an EndFlag$ übergeben?

Code: Alles auswählen

PokeS(*Parameters\EndFlag$,"fertig",10, #PB_Ascii)
funktioniert nicht, da bekomme ich die Meldung Bad Parameter Type...

Code: Alles auswählen

*Parameters\EndFlag$ = "fertig"

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

Verfasst: 13.07.2019 10:40
von mk-soft
So geht es recht einfach...

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

Link: Mini Thread Control

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

Verfasst: 13.07.2019 21:54
von Sommertv
Danke schön,
das ist ein schönes ausbaufähiges Beispiel...

Schöne Grüsse
Kurt