Frage zu QThread (run-Methode)

Alles rund um die Programmierung mit Qt
Antworten
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Frage zu QThread (run-Methode)

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

Beitrag von upsala »

Verschieb halt dein QObject in den aktuellen Thread
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag von Tom_Tom »

Was meinst du damit?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

void QObject::moveToThread ( QThread * targetThread )
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

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

Beitrag von upsala »

Doku gelesen? Schon mal überlegt, wo dein Object erstellt wurde?
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag von Tom_Tom »

Welches QObject meinst du denn? Ist doch alles QObject.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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!!
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag von Tom_Tom »

Ich weiß schon, was ihr mir sagen wollt.
Aber dann funktioniert meine restliche Programmstruktur nicht mehr.
Ich schaue einfach mal weiter.
Antworten