Seite 1 von 1

Threads und Signal/Slot

Verfasst: 2. September 2009 08:54
von TheBert
Hallo,

ich hab mich in letzter zeit etwas mit threads beschäftigt, und jetzt habe ich da eine verständnisfragen:

Laut dem threaded fortune server

Code: Alles auswählen

 FortuneThread::FortuneThread(int socketDescriptor, const QString &fortune, QObject *parent)
     : QThread(parent), socketDescriptor(socketDescriptor), text(fortune)
 {
 }

 void FortuneThread::run()
 {
     QTcpSocket tcpSocket;
     if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
         emit error(tcpSocket.error());
         return;
     }

     QByteArray block;
     QDataStream out(&block, QIODevice::WriteOnly);
     out.setVersion(QDataStream::Qt_4_0);
     out << (quint16)0;
     out << text;
     out.device()->seek(0);
     out << (quint16)(block.size() - sizeof(quint16));

     tcpSocket.write(block);
     tcpSocket.disconnectFromHost();
     tcpSocket.waitForDisconnected();
 }
Wird ja alles in der run() methode als thread ausgeführt, was passiert aber, wenn ich z.b. in dem thread auf signal warten muss und danach einen slot ausführe, wird dieser dann auch noch in dem thread ausgeführt? Denn ich möchte das alles was mit dieser "eingehenden verbindung" passiert in einem thread abgearbeitet wird.

Als beispiel:

Code: Alles auswählen

 FortuneThread::FortuneThread(int socketDescriptor, const QString &fortune, QObject *parent)
     : QThread(parent), socketDescriptor(socketDescriptor), text(fortune)
 {
 }

 void FortuneThread::run()
 {
     connect(tcpSocket, SIGNAL(readReady()), this, SLOT(readData()));

     exec();

 }
 FortuneThread::readData()
 {
    //...
    //read data from socket
    //...
 }

Ich weiß das exec() eine eigene event loop startet, macht mein code genau das was ich möchte?

Danke!

Mfg Bert

Verfasst: 2. September 2009 13:19
von solarix
Genau.. das ist sauber. Der Slot "readData() " wird in diesem Fall aus dem Kontext des Threads aufgerufen.

BTW: Solltest du aus dieser Methode ein eigenes Signal emittieren ("emit submit(parsedData);") darfst du noch das "moveToThread(this)" im Konstruktor nicht vergessen...