Variable an einen Thread übergeben und wenn fertig abfragen
-
- 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
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
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
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
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.
(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
Dafür sind Semaphore da: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.
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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- 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
Eigentlich benutzt man für das, wovon Stargate redet, sogar Condition Variables, leider gibt es die in PB nicht.
-
- 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
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?
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
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
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.
-
- 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
Guten Morgen,
ok... das leuchtet mir ein, iss mein Fehler...
Wie kann ich dann einen Rückgabestring an EndFlag$ übergeben?
funktioniert nicht, da bekomme ich die Meldung Bad Parameter Type...
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)
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
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?funktioniert nicht, da bekomme ich die Meldung Bad Parameter Type...Code: Alles auswählen
PokeS(*Parameters\EndFlag$,"fertig",10, #PB_Ascii)
Code: Alles auswählen
*Parameters\EndFlag$ = "fertig"
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
Ich habe es mal zu einen Mini-Thread-Control umgebaut
Link: Mini Thread Control
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
-
- 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
Danke schön,
das ist ein schönes ausbaufähiges Beispiel...
Schöne Grüsse
Kurt
das ist ein schönes ausbaufähiges Beispiel...
Schöne Grüsse
Kurt
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...