ich versuche mal mein Problem zu schildern. Ich habe eine Multithreading-Umgebung.
Code: Alles auswählen
- main.cpp
- Controller-Klasse
- MainWindow
- HLAThread-Klasse
- Federate-Klasse
- Ambassador-Klasse (Fedamb)Folgende Klassen laufen in einem eigenen Thread
- MainWindow
- HLAThread
- Federate
- Ambassador (meines Erachtens, sind Fremdsourcen)
Ich muss nun ein Ereignis von Fedamb nach MainWindow bekommen. Nur die kennen sich nicht, wegen InformationHiding und MVC, also habe ich ein Signal von Fedamb nach Federate in Federate connected, dies ruft wiederum ein Signal auf, das im HLAThread wiederum ein Signal aufruft (connected im HLAThread.
Dieses Signal im HLAThread ist im Controller mit einem Slot im Mainwindow connected.
Alle beteiligten Klassen erben von QObject. Bis zum HLAThread wird das Signal mit einer DirectConnection weitergereicht.
Im MainWindow habe ich allerdings einen QWTPlot. Und dieser Plot erwartet in der Methode replot, dass die aus demselben Thread aufgerufen wird in dem der Plot auch läuft. Also geht hier meine bevorzugte Qt.:DirectConnection nicht. Meines Erachtens wäre hier das sinnvollste das Qt::BlockingQueuedConnection. Wenn ich das allerdings einbaue, wird der Slot in QMainwindow nie erreicht.
Ich bin schon am Überlegen, ob ich einfach die Daten meines Plots aktualisiere und dann mit dem Timer das Replot() aufrufe, aber das ist halt nicht wirklich schön, sollte abr funktionieren.
Aber kann mir jemand erklären, warum mein
Code: Alles auswählen
connect(&threadHLA, SIGNAL(newObjectAttributeValue(const QString &, const QString &, double &)),
mainWin, SLOT(newObjectAttributeValue(const QString &, const QString &, double &)), Qt::BlockingQueuedConnection);Die Threads sollten doch nach einem Round-Robin-Prinzip oder nach einem ähnlichen Prinzip alle mal an die Reihe kommen und abgearbeitet werden. Oder kann das eventuell sein, dass mein Programm meine Variablenreferenzen vergisst?
Über jegliche Art an Aufklärung wäre ich enorm dankbar.
Ciao
Alexander
PS: Doku zu Multithreading, QWTPlot und Qt::ConnectionType habe ich mehrmals durchgearebitet.
Code: Alles auswählen