[geloest] QTimer-Objekt in Thread
Verfasst: 13. Mai 2008 19:39
Guten Abend,
Ich habe eine Server geschrieben (abgeleitet von QTcpServer), der die Client-Anfragen in Threads verarbeitet. Hier mal die ueberschriebene incommingConnection-Funktion:
Die CommunicatorCall-Klasse ist von QThread abgeleitet. Sie hat einen Zeiger auf ein QTimer-Objekt in ihrem private-Part:
In der ueberschriebenen run()-Routine von CommunicatorCall initialisiere ich den Timer wie folgt:
der Slot timeoutOccurred() macht nichts anderes, als dass er versucht die Verbindung zum client zu trennen und mittels Timer erneut 10 Sekunden auf das disconnected()-Signal vom Socket wartet. Kommt dieses rechtzeitig vor Timer-Ablauf, so wird der disconnected()-Slot automatisch aufgerufen, ansonsten tue ich das manuel:
timeoutOccurred(void):
Im disconnected-Slot halte ich den Timer an, und rufe den Quit-slot auf, so dass sich der Thread selbst aufloest:
Aus irgendeinem Grund erhalte ich zwischen dem quit()-Aufruf und dem Destruktur-Aufruf des Thread-Objektes die Meldung:
QObject::startTimer: QTimer can only be used with threads started with QThread
Allerdings taucht sie nur ab und zu auf und ist damit leider nicht reproduzierbar. Hat jemand eine Idee, an was das liegen koennte bzw. wie man an die Sache rangehen kann?
Ich bin fuer jeden Tipp dankbar!
Col
Ich habe eine Server geschrieben (abgeleitet von QTcpServer), der die Client-Anfragen in Threads verarbeitet. Hier mal die ueberschriebene incommingConnection-Funktion:
Code: Alles auswählen
void receiver::incomingConnection(int socketDescriptor)
{
CommunicatorCall *comm = new CommunicatorCall(...); //kein Parent!
connect( comm, SIGNAL(finished()),
comm, SLOT(deleteLater()), Qt::DirectConnection);
//die error- und event-Messages werden einfach weitergereicht:
connect( comm, SIGNAL(errorMessage(const QString&)),
SIGNAL(errorMessage(const QString&)), Qt::QueuedConnection);
connect( comm, SIGNAL(eventMessage(const QString&)),
SIGNAL(eventMessage(const QString&)), Qt::QueuedConnection);
comm->start();
}
Code: Alles auswählen
...
private:
QTimer *timeout;
...
Code: Alles auswählen
timeout = new QTimer;
timeout->setSingleShot(true);
timeout->setInterval(10 * 1000); //our timeout is 10 sec
...
connect( timeout, SIGNAL(timeout()),
this, SLOT(timeoutOccurred()), Qt::DirectConnection);
...
timeout->start();
timeoutOccurred(void):
Code: Alles auswählen
timeout->stop();
socket->disconnectFromHost();
disconnect( timeout, SIGNAL(timeout()),
this, SLOT(timeoutOccurred()));
connect( timeout, SIGNAL(timeout()),
this, SLOT(disconnected()), Qt::DirectConnection);
timeout->start();
Code: Alles auswählen
timeout->stop();
quit(); //exit thread
QObject::startTimer: QTimer can only be used with threads started with QThread
Allerdings taucht sie nur ab und zu auf und ist damit leider nicht reproduzierbar. Hat jemand eine Idee, an was das liegen koennte bzw. wie man an die Sache rangehen kann?
Ich bin fuer jeden Tipp dankbar!
Col