Ich habe eine GTK-Anwendung, wo ich einige Aufgaben parallel ausführen müssen. Die Anwendung empfängt Daten von einer seriellen Schnittstelle und muss dann abhängig von den Daten Text auf dem Etikett anzeigen und Audio abspielen. Ich verwende eine ereignisbasierte serielle Kommunikation, die ein Flag hoch setzt, wenn die Daten empfangen werden.Multitasking in GTK-Anwendung
In der Hauptschleife habe ich 3 Threads erstellt, die ich infinitely laufen lasse.
Thread1 to read serial data
Thread2 to display data on gtk label
Thread3 to play audio
Thread1 wird aktiviert, wenn das Signal vom seriellen Port-Ereignis empfangen wird. Nach dem Lesen der Daten wird ein Flag high gesetzt, das dann Thread2 aktiviert. Thread2 dekodiert dann die seriellen Daten und zeigt ihre Informationen auf dem Etikett an. Es setzt dann ein anderes Flag high, welches das Thread3 aktiviert und dann Thread3 eine Audiodatei wiedergibt.
Ich muss Thread2 und Thread3 parallel ausführen. Damit der Text, der auf dem Etikett und im Audio angezeigt wird, gleichzeitig erfolgen soll. Zur Zeit mache ich etwas wie unten:
Thread2
{
while(1)
{
if(serialData == TRUE)
{
//decode the serial data and display it
startAudio = TRUE //Indicate Thread3 to play audio
serialData = FALSE
}
}
}
Thread3
{
while(1)
{
if(startAudio == TRUE)
{
//play audio
startAudio = FALSE
}
}
}
Zu aktueller Situation, ich habe nicht viel serielle Daten zu dekodieren, so Text angezeigt und Audio beiden Blicke synchronisiert. Aber wenn die Daten groß sind, dann denke ich, dass beide nicht synchronisiert werden. Gibt es eine Möglichkeit, diese Aufgabe parallel auszuführen?
Wenn Sie asynchrone Bibliotheken (wie Gio, Gstreamer) verwenden, sollte es keinen Grund geben, Threads für die von Ihnen erwähnten Aufgaben zu verwenden. Ich sage nicht, dass man sie nicht benutzen kann, aber wenn man Threads meiden kann, ist das normalerweise eine gute Idee. – jku