Seite 1 von 1

Threaded QTcpServer - Signal Probleme

Verfasst: 1. Mai 2007 22:02
von caligano
Hallo!

Ich habe eine Klasse Server, abgeleitet von QTcpServer.
Bei jeder incomingConnection() wird ein Thread erstellt, der dann die jeweilige Verbindung bearbeitet.

Code: Alles auswählen

void Server::incomingConnection(int socketDescriptor)
{
	Thread *thread = new Thread(socketDescriptor, this);
	connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
}

Code: Alles auswählen

Thread::Thread(int socketDescriptor, QObject *parent)
    : QThread(parent), socketDescriptor(socketDescriptor)
{
	
	QTcpSocket *tcpSocket  = new QTcpSocket(this);
	tcpSocket->setSocketDescriptor(socketDescriptor);
	connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readRequest()));
	connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnectClient()));
}
Thread::run() ist leer, dagegen sind readRequest() und disconnectClient() implementiert.

Die Sockets werden auch bearbeitet, aber das Signal finished() wird nie ausgelöst! Wenn man im Taskmanager den Arbeitspeicherverbrauch beobachtet, merkt man einen kontinuierlichen Anstieg! D.h., die Thread Objekte werden wohl nicht gelöscht!
Was kann ich dagegen machen? Warum wird finished() nicht ausgelöst?

danke schon mal

cal

Verfasst: 2. Mai 2007 09:15
von upsala
Sollte in QThread::run nicht ein exec() drinnen sein. Und das Signal finished() wird erst gesendet wenn run() beendet wird. Wenn run() natürlich leer ist, wird run() gleich nach deinem new Thread() ausgeführt, blos da ist das Signal noch gar nicht connected, also siehst du es nicht.

Laufen deine Slots überhaupt im richtigen Thread?

Verfasst: 2. Mai 2007 09:16
von Christian81
Einfach mal schauen ob in disconnectClient() der Thread auch beendet wird. Ausserdem muss in Thread::run() zumindest exec(); aufgerufen werden.
Des weiteren ist der erzeugte QTCPSocket nicht im Thread sondern im Hauptthread angelegt. Wenn er in Thread angelegt werden soll musst Du ihn irgendwo in/nach Thread::run() erzeugen.