Threaded QTcpServer - Signal Probleme

Alles rund um die Programmierung mit Qt
Antworten
caligano
Beiträge: 126
Registriert: 19. August 2006 15:33

Threaded QTcpServer - Signal Probleme

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten