andere Frage zu Threads, Signale und Slots
Verfasst: 24. September 2010 10:46
Moin.
Ich habe es dank der Hilfe in diesem tollen Forum geschafft über meine Anwendung über Sockets mit einer Hostanwendung zu verbinden und die dort gesendeten Daten richtig zu empfangen. Dafür nochmal vielen Dank an alle die mir geholfen haben.
Nun ist das 'Besondere' bei mir, dass das Verbinden in einem separaten Thread läuft:
Wenn ich das nun richtig verstanden habe, startet exec() ja die Event loop.
1. Heißt das, dass alle Events wie z.B SocketStateChanged() oder readyRead() im Kontext dieses Threads laufen?
Wenn ich nun in dem Slot ReadFromSocket() meine Daten empfangen habe, liegen diese in einem selbst definierten struct (welches noch ein union enthält) vor.
Diese Daten muss ich jetzt irgendwie in den Hauptthread bekommen wo diese die GUI verändern/aktualisieren soll.
2. Wie muss ich da vorgehen?
Wäre das die richtige Vorgehensweise: Eine Signal(zweiter Thread)/Solt(Haupthread mit GUI) einrichten. Dem Slot einen Zeiger der Daten mitgeben, mit dem er sich dann eine Kopie erstellt.
Würde mein zweiter Thread dann weiterlaufen, oder so lange blockiert sein, bis der Slot fertig ist?
Vielen Dank.
//Edit Listing ergänzt
Ich habe es dank der Hilfe in diesem tollen Forum geschafft über meine Anwendung über Sockets mit einer Hostanwendung zu verbinden und die dort gesendeten Daten richtig zu empfangen. Dafür nochmal vielen Dank an alle die mir geholfen haben.
Nun ist das 'Besondere' bei mir, dass das Verbinden in einem separaten Thread läuft:
Code: Alles auswählen
QSocketEngine::QSocketEngine(QObject *parent) :
QThread(parent)
{
...
...
// neuen Tcp-Socket erstellen
m_pTcpSocket = new QTcpSocket();
//--- Objekt in diesen Thread 'verschieben'
m_pTcpSocket->moveToThread(this);
connect(m_pTcpSocket, SIGNAL(readyRead()),
this, SLOT(ReadFromSocket() ) );
...
...
}
void QSocketEngine::run()
{
do
{
// Falls in Verwendung, Socket zurücksetzen
m_pTcpSocket->abort();
// Mit dem Server verbinden
m_pTcpSocket->connectToHost("192.168.1.50", 4000);
}
while(!m_pTcpSocket->waitForConnected());
exec();
}
1. Heißt das, dass alle Events wie z.B SocketStateChanged() oder readyRead() im Kontext dieses Threads laufen?
Wenn ich nun in dem Slot ReadFromSocket() meine Daten empfangen habe, liegen diese in einem selbst definierten struct (welches noch ein union enthält) vor.
Diese Daten muss ich jetzt irgendwie in den Hauptthread bekommen wo diese die GUI verändern/aktualisieren soll.
2. Wie muss ich da vorgehen?
Wäre das die richtige Vorgehensweise: Eine Signal(zweiter Thread)/Solt(Haupthread mit GUI) einrichten. Dem Slot einen Zeiger der Daten mitgeben, mit dem er sich dann eine Kopie erstellt.
Würde mein zweiter Thread dann weiterlaufen, oder so lange blockiert sein, bis der Slot fertig ist?
Vielen Dank.
//Edit Listing ergänzt