QT und Threads
-
Ich habe einen Thread der quasi einen Socket liest/beschreibt und die Messages parsed ( in Planung )
Wie verfahre ich jetzt mit den Messages. Wie lasse ich die dem MainGuiThread zukommen.
Ich müsste die Daten ja quasi in eine threadsafe Liste pushen, die dann irgendwie vom MainThread ausgelesen wird.
Beim BCB6 hätte ich einfach einen Timer genommmen um die Q auszulesen.Verfährt man hier bei QT ähnlich?
Wie Threadsafe ist eigentlich die ganze Grafikkonstruktion?
Kann ich z.B. gesonderte Aufgaben einem Thread zukommen lassen, der z.B. nur eine bestimmte Scene rendered? Diese Scene gehört beispielweise dem MainWindow. Gibt das Probleme?Wie verhält es sich mit den ganzen Signalen und Slots? Kann ein Thread z.B. ein Signal an ein Widget des MainWindow senden, oder gibt das Ärger?
Gibt es spezielle Konzepte, die man bzgl. Multithreaded Frontends bei QT verfolgt?
Zudem habe ich gelesen, dass man prinzipiell zum Auslesen eines Sockets in QT nicht unbedingt einen Thread betreiben muss, da das ganze eventbasiert ist.
Macht das Sinn? Derzeit gehe ich davon aus, dass nicht unbedingt wahnsinnig viele Messages zwischen meinem Frontend und dem Server ausgetauscht werden. Dadurch würde ich mir quasi das Multithreading einsparen und die ganze Problematik etwas entschärfen.
-
RTFM! Stelle konkrete Fragen! Ja, macht Sinn!
-
It0101 schrieb:
Kann ich z.B. gesonderte Aufgaben einem Thread zukommen lassen, der z.B. nur eine bestimmte Scene rendered? Diese Scene gehört beispielweise dem MainWindow. Gibt das Probleme?
Ich formuliere diese Frage noch mal anders.
Folgendes Szenario:Ich hab eine Komponente, z.b. eine QGraphicsScene, die dem QMainWindow gehört, welches ja vom hauptsächlichen GuiThread betrieben wird.
Daneben existiert ein gesonderter Thread, der immer mal wieder Zeichenoperationen auf der Scene durchführt.Ist das in QT möglich?
PS: GMALTTFM ( give me a link to the fucking manual )
Hier im FAQ siehts in Sachen QT irgendwie ziemlich dünn aus. Die ehemalige Trolltech-Links sind auch alle kaputt.
-
PS: GMALTTFM ( give me a link to the fucking manual )
http://qt-project.org/doc/qt-4.8/
Daneben existiert ein gesonderter Thread, der immer mal wieder Zeichenoperationen auf der Scene durchführt.
-
It0101 schrieb:
Daneben existiert ein gesonderter Thread, der immer mal wieder Zeichenoperationen auf der Scene durchführt.
Ist das in QT möglich?
Es ist grundsätzlich der falsche Weg, ob Qt oder nicht. Du solltest eher die Zeichenoperationen in einem Buffer sammeln und von der GUI ab und zu zeichnen lassen. Baust vielleicht noch ein Signal, das mitteilt, dass es neue Daten gibt.
-
Ok, das dachte ich mir schon. So werde ich das dann auch machen. In dem Thread werde ich die Zeichenoperationen so weit wie möglich vorbereiten, dann in einen Container stopfen, der wiederum vom MainGuiThread ausgelesen wird.
Der MainThread wird ja vermutlich irgendwo im Hintergrund eine Schleife betreiben, wo verschiedenen Sachen unternommen werden ( Events triggern, etc. ).
In dieser Schleife würde ich dann gern meinen Container auslesen und die Aktualisierungen vornehmen. Wie komme ich in die Schleife rein? Gibt es da irgendwo ein Event, was bei jedem Schleifendurchlauf des MainThreads aufgerufen wird, oder muss ich mir selber einen Timer anlegen, falls es sowas gibt?
-
Du solltest dich echt mal mit Grundlagen, sprich Betriebssystemen, bissi grundlagem wie grafik am PC funktioniert, auseinandersetzen, wenn DU sowas komplexes bauen willst.
Der MainThread wird ja vermutlich irgendwo im Hintergrund eine Schleife betreiben
Ist bei jeden Eventgesteuerten System, jedem fenster-basierten system sicher so ^^
In dieser Schleife würde ich dann gern meinen Container auslesen und die Aktualisierungen vornehmen. Wie komme ich in die Schleife rein? Gibt es da irgendwo ein Event, was bei jedem Schleifendurchlauf des MainThreads aufgerufen wird, oder muss ich mir selber einen Timer anlegen, falls es sowas gibt?
Dir fehlt das Verständiss fuer Msg/Eventloops. Les dich da mal bissi ein ...
Generell: Du registriest fuer dich intressante Events eine Aussprung-Funktion.
Tritt das Event ein, dann springt die Loop deine Funktion an.
Du kannst auch selber events festlegen.
ALso ein thread der in einen container schreibt, kann eine Msg in die loop "pushen" ... die loop (also der maintrhead) springt dann in die aussprung-funktion, liest aus dem container usw.
Eigentlich die häufgste form wie man Threadwechsel in Loop basierten system macht.DIe grafik unter windows, also das windows-subsystem z.b. ist aber bedingt multithreading-fähig. die Eventloop / Msg Loop / Msg Pump muss ja in nem bestimmten thread laufen.
DU kannst aber zu einem nicht loop (event) basierenden System switchen ....
DirectX / OpenGL. Allerdings musst dich dann von dem fensterkonzept verabschieden, zumindest in dem Teil.Ciao ....