Variable an einen Thread übergeben und wenn fertig abfragen

Anfängerfragen zum Programmieren mit PureBasic.
Sommertv
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

Beitrag 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
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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.
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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

Beitrag von NicTheQuick »

Eigentlich benutzt man für das, wovon Stargate redet, sogar Condition Variables, leider gibt es die in PB nicht.
Bild
Sommertv
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

Beitrag 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
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

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

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Sommertv
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

Beitrag 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...
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

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

Beitrag 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"
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag von mk-soft »

So geht es recht einfach...

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
Sommertv
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

Beitrag von Sommertv »

Danke schön,
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...
Antworten