QThread in QThread erstellen

Verschiedenes zu Qt
Antworten
markus79
Beiträge: 3
Registriert: 23. Oktober 2007 10:49

QThread in QThread erstellen

Beitrag von markus79 »

Hallo Forumgemeinde, hier mein erstes Posting:

Ich beschäftige mich jetzt etwas mit Threads sowie mit den Client/Server Tutorials, stehe jetzt aber vor einem Problem:

Ich implementiere eine Applikation um Messungen durchzuführen welche dem Threaded Fortune Server Example ähnlich ist.

RequestListener (wartet auf Messanfragen)

Code: Alles auswählen

void RequestListener::incomingConnection(int socketDescriptor) {
	RequestHandler *h = new RequestHandler(socketDescriptor, this);
	QObject::connect(h, SIGNAL(finished()), h, SLOT(deleteLater()));
	h->start();
}

RequestHandler (Schaut welche Anfrage kommt)

Code: Alles auswählen

void RequestHandler::run() {

	flag = true;
	socket = new QTcpSocket();;
	connect(socket, SIGNAL(disconnected()), this, SLOT(lostConnection()));
	
	if (!socket->setSocketDescriptor(socketDescriptor)) {
		qDebug() << "Error: " << socket->error();
		emit error(socket->error());
		return;
	}

	while (flag) {
		if (socket->waitForReadyRead(2000)) readSocket(socket);
	}
	

}
In der Funktion readSocket(QTcpSocket*) erstelle ich anhand des erhaltenen Befehls (im Moment verwende ich Start und Stop + eine id) einen neuen Thread (TaskHandler) im Fall des Befehls Start. Dies funktioniert auch. Übergebe zusätzlich den socketDescriptor um den Client Informationen über die aktuelle Messung zurückzuschicken.

Das Problem ist jetzt dass jetzt diesen Thread nicht mehr automatisch löschen kann sondern nur indem ich das STOP signal schicke und nicht mit deleteLater(...) sobald die Messung in der run() Methode fertig ist. Ich weiß zwar dass das mit der Event-Loop zusammenhängt und irgendwie die SIGNALS nicht ankommen, aber alle verschiedenen Übergaben eines Parents führen zur Fehlermeldung: Cannot create children for a parent that ist in a different thread.

Gibt es hierfür irgendwie eine Lösung oder handelt es sich hierbei um einen Designfehler?

Wäre für jede Hilfe dankbar.

Mit freundlichen Grüßen,
Markus Demetz
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Imho ist es ein Designfehler wenn ein Thread einen weiteren erzeugt. Das sollte alles über den mainThread funktionieren.
deleteLater() funktioniert natürlich nur wenn der Thread auch in der Eventloop ist, was er augenscheinlich nicht ist. Siehe QThread::exec()
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten