Funktion aus Main in einem Thread ausführen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kriccemis
User
Beiträge: 15
Registriert: Freitag 8. Mai 2020, 20:10

Hallo Liebe Community,

ich habe eine Frage zum ausführen von Funktionen.
In einem Projekt sollen in einem Thread Bilder aufgenommen und weiterverarbeitet werden. Die dabei entstandenen Ergebnisse sollen in das Main Programm übergeben werden und dann dort in "realtime" geplottet werden.
Aktuell ist das Programm so aufgebaut, dass der Thread separat läuft und über einen Timer im Main Programm immer die Plotfunktion ausgeführt wird. Dies hat den großen Nachteil das es asychron läuft und die Daten teilweise Fehlerhaft dargestellt werden, da der Thread den durchlauf noch nicht fertig hat. Ich habe das Programm selbst nicht geschrieben muss aber die notwendigen Veränderungen daran vornehmen.

Mein Lösungsansatz ist es, die Funktion zum Plotten aus dem Main nach vollständigem Durchlauf des im Thread ausgeführten Abschnittes dort aufzurufen.
Daher meine Frage ist es generell möglich eine Funktion aus dem Main im separaten thread ausführen zu lassen?
Gern bin ich auch für andere alternativen offen, wichtig ist mir das ich am Ende die Daten nur im Hauptprogramm Plotte, sobald die Schleife im Thread einmal durchlaufen ist.

VG und Danke für eure Hilfe.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

So ganz klar was du da machen willst ist mir das nicht, aber es klingt so, als ob du aus dem Arbeitsthread plotten willst. Das geht nicht. GUI-Elemente duerfen nur aus dem Mainthread modifiziert werden.

Nach Beschreibung des bestehenden Vehaltens ist die Loesung in erster Naeherung trivial: im Timer nicht einfach drauflosmalern, sondern nur dann plotten, wenn der Arbeitsthread explizit signalisiert hat "jetzt ist fertig".

Eine bessere Loesung wuerde einen thread-sicheren callback-Mechanismus benutzen, die meisten GUI-Frameworks bieten da etwas. Was benutzt ihr?
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Üblich ist es, Ergebnisse per Queue vom Arbeitsthread an das GUI-Hauptprogramm zurückzumelden. Da kann es per Konstruktion gar keine unvollständigen Daten geben.
Wenn Du also unvollständige Daten hast, dann greifst Du verbotener Weise von zwei Threads gleichzeitig auf die selben Daten zu.
Kriccemis
User
Beiträge: 15
Registriert: Freitag 8. Mai 2020, 20:10

Danke für die schnelle Antwort, Ich versuche mein Problme etwas genauer zu erklären, Ich möchte auch hier noch einmal kurz erwähnen, dass ich das Programm nicht selbst geschrieben habe, aber die "undankbare" Aufgabe habe es weiter zu verbessern.

In einem Thread läuft eine endlosschleife die permanent Bilder aufnimmt, eine Kantendetektion macht und die Ergebnisse in eine Liste schreibt (im weiteren als Werte_Liste bezeichnet) zudem wid auch eine Zeit_Liste erstellt. Solange der Thread nicht über einen Button gestoppt wird läuft die Messung und die beiden Listen füllen sich.
Im hauptprogramm sollen die Ergebnisse nach jedem Schleifendurchlauf geplottet werden in einem X-Y Diagramm.
Stand jetzt ist es, so geschrieben, dass im Thread die beiden Listen erzeugt und beschrieben werden und über einen Timer im Hauptprogramm in festen Zeitintervallen auf die Listen zugegriffen wird. Beispielsweise brauch das Thread 400ms für einen Durchlauf, der Timer aktualisiert aber immer all 1000ms so wird kommt dann beim Ergebnis blödsinn ruas, manchmal auch richtig, wenn man Glück hat.

Erstellt wurde die GUI mit dem QT Designer.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann liegt die Antwort darin, den Thread via einer "queued connection" die Ergebnisse seiner Arbeit an den Main-Thread zu kommunizieren. Das ist in Qt thread-sicher (aber NUR wenn man is mit queued connections macht!), und befreit von der Notwendigkeit des Timers. Stattdessen started die GUI im genau passenden Moment, wenn die Daten fertig sind.

Ein Beispiel habe ich mal hier gebaut: viewtopic.php?f=24&t=44250&start=15#p335559 - es ist nicht ganz ideal, weil da ein paar Sachen mehr passieren, als zwingend notwendig, aber es illustriert das prinzipielle Vorgehen.
Antworten