Seite 1 von 1

Frage zu QThread (run-Methode)

Verfasst: 14. Oktober 2008 10:32
von Tom_Tom
Hallo. Ich habe einen Server, der jede eingehende Verbindung in einem extra Thread behandelt.

Hier die run-Methode des ConnectionThreads.

Code: Alles auswählen


void ClientConnectionThread::run() {

	try
		{
			if(this->socket->waitForReadyRead(-1))
			{
			        //eingehende Daten überprüfen / verarbeiten
                                //und dann einen Wert zurückliefern
				
                                this->socket->write("Hallo",5);
			}
		}
		catch(QString)
		{
			qDebug("Socket existiert nicht");
		}

	exec();
}
Bei diesem Code bekomme ich eine Meldung zurück:
QObject: Cannot create children for a parent that is in a different thread.

Das liegt an dieser write()-Methode, die ich dort aufrufe.
Wie kann ich das anders lösen, dass es aber immerhin noch als extra Thread läuft und nicht meinen ganzen Server blockt?

Ich erbitte dringend eure Hilfe.

Verfasst: 14. Oktober 2008 12:22
von upsala
Verschieb halt dein QObject in den aktuellen Thread

Verfasst: 14. Oktober 2008 12:30
von Tom_Tom
Was meinst du damit?

Verfasst: 14. Oktober 2008 18:07
von upsala

Code: Alles auswählen

void QObject::moveToThread ( QThread * targetThread )

Verfasst: 14. Oktober 2008 18:17
von Tom_Tom
Ich verstehe immernoch nicht so ganz, was du meinst.
Kannste mir mal meinen Code anpassen, dass ich das sehe, was du meinst?

Verfasst: 14. Oktober 2008 19:06
von upsala
Doku gelesen? Schon mal überlegt, wo dein Object erstellt wurde?

Verfasst: 15. Oktober 2008 07:41
von Tom_Tom
Welches QObject meinst du denn? Ist doch alles QObject.

Verfasst: 15. Oktober 2008 08:56
von solarix
upsala dachte natürlich an das Object, das dein Problem verursacht ("socket")... was denn sonst?
Das Problem ist aber, dass moveToThread() IMHO der falsche Ansatz ist, weil damit nur der Mainthread dem SocketThread das Object "schenken" (push) kann... der SocketThread kann sich damit das Objekt nicht vom Mainthread "klauen"..

Ist aber egal.. wenn du schnell das "Threaded Fortune Example" anschaust, werden deine Fragen geklärt :wink:
http://doc.trolltech.com/4.3/network-th ... erver.html

Verfasst: 15. Oktober 2008 15:26
von Tom_Tom
Das Beispiel habe ich mir schon hundertmal angesehen, hilft mir aber kein bisschen weiter.

Schauen wir uns nochmal folgenden Bereich an:

Code: Alles auswählen

 if(this->socket->waitForReadyRead(-1)) 
         { 
                 //Beispiel:
                 //Wenn this->socket->read...... = "Login" ist, dann schreibe:
                 this->socket->write("Hallo",5); 
         } 
Und da meckert er eben beim schreiben.
Und dazu bräuchte ich jetzt eine Lösung, wie ich das anders machen kann.

Verfasst: 15. Oktober 2008 17:46
von solarix
Wenn du das schon hundertmal angesehen hast, dann schaue es zum hundertundersten mal an und schreibe uns, was die ersten beiden Zeilen der Methode "FortuneThread::run()" tun!!

Verfasst: 16. Oktober 2008 07:15
von Tom_Tom
Ich weiß schon, was ihr mir sagen wollt.
Aber dann funktioniert meine restliche Programmstruktur nicht mehr.
Ich schaue einfach mal weiter.