[gelöst] Threads und Netzwerkübertragung

Alles zum Qt Framework für Java
Antworten
informat
Beiträge: 11
Registriert: 27. Juni 2008 18:53

[gelöst] Threads und Netzwerkübertragung

Beitrag von informat »

Hallo,

zu diesem Thema gibt es eine ganze Menge im Internet - trotzdem kriege ich es nicht hin:

Ich habe einen Server am Laufen, der für jeden Client einen Thread aufmacht, ein paar Daten aus dem Datenmodell des Servers holt und sie dem Client zurückschickt.
Das funktioniert so leider nicht mit QT, weil die Objekte des Datenmodells nunmal nicht im Gültigkeitsbereich des Threads sind.
So wie ich die TrollTech-Doku verstehe, muss ich dem Main-Thread des Servers über seine Eventloop mitteilen, dass er diese Funktion für den lokalen Thread aufrufen soll, weil er dazu berechtigt ist, oder?
Es wäre super nett, wenn mir jemand ein Stück code posten oder einen Link geben könnte, wie man dem Main-Thread mitteilen kann, dass er eine bestimmte Funktion aufruft.

PS:
Das hier funktioniert nur für vergleichbare GUI-Probleme:
QApplication.invokeLater(new Runnable() {
public void run() {
label.setText("...");
}
});

Schönen Gruß,
informat
Zuletzt geändert von informat am 28. Juni 2008 23:23, insgesamt 1-mal geändert.
Forest
Beiträge: 26
Registriert: 22. Juni 2008 03:10

Beitrag von Forest »

ehrlich gesagt habe ich genau diese erklärung bei trolltech zu diesem problem auch nicht richtig verstanden. Ich hab dann einfach probier ein Signal rüberzuschicken zum Main Thread und das hat funktioniert. Dann habe ich das dabei gelassen und mir die Erklärung von Trolltech nicht weiter angeschaut...

Also ich kann deswegen nur sagen, versuch es mal einfach mit Signalen von den Threads aus zum Main Thread.
Connecten kannst entweder in den Threads selber (z.B. Konstruktor durch übergabe der Main Thread Klasseninstanz) oder im Main Thread bei der Erzeugung... (hier http://qtforum.de/forum/viewtopic.php?t=6958 hatte ich wegen letzterem ne kleine Diskussion angefangen)
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

ich schließe mich mal an ...

ich hatte die Doku in Trolltech so verstanden, dass (neuerdings) die Signale über verschieden Threads gesendet werden können. Hat aber nicht so recht geklappt.

Ich bin dann wieder auf den 'alten Stiefel' zurück und habe (meine eigenen Events) über das asynchrone

Code: Alles auswählen

QApplication.postEvent(..)
gesendet, dass ist auf alle Fälle threadsicher und funktioniert einwandfrei :-)

Gruß Arne
informat
Beiträge: 11
Registriert: 27. Juni 2008 18:53

Beitrag von informat »

Hallo,

erstmal danke für die Anregungen.
Ich versuche nach diesen Infomationen
http://lists.trolltech.com/qt-interest/ ... 246-0.html
, die postEvent()-Strategie, ich habe bisher:

Code: Alles auswählen

QApplication.postEvent(this, new MyEvent(null, request, out, socket));
an die Stelle im Thread geschrieben sowie eine Methode

Code: Alles auswählen

private void customEvent(MyEvent me)
{
    if(me.sync)
   {
        HashSet<SyncPackage> response = synchronize(me.request);
	try {
		    me.out.writeObject(response);
		    me.out.flush();
		    me.out.close();
		    me.socket.close();
		 } catch (IOException e) {
			log.warn(e.getMessage());
		 }
	     }
    }
}
geschrieben.

Wo muss ich jetzt die customEvent()-Methode aufrufen, damit der Main-Thread sie ausführt?
Kann ich dem ersten Parameter (vom Typ QPrivateConstructor) der Klasse 'MyEvent' einfach null übergeben (s.o.)?

Schönen Gruß,
informat
informat
Beiträge: 11
Registriert: 27. Juni 2008 18:53

Beitrag von informat »

Ich habe die Zeile im lokalen Thread jetzt zu:

Code: Alles auswählen

QApplication.sendEvent(this, new MyEvent(QEvent.Type.CustomEnum, request, out, socket));
geändert.
Das Problem ist aber nach wie vor, dass ich nicht weiß, was ich tun muss, dass die customEvent()-Methode als Antwort auf das gesendete Signal vom Main-Thread ausgeführt wird...
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Also der Empfänger (in diesem Falle this) kann auf das Event in der abgeleiteten Methode

Code: Alles auswählen

boolean event(QObject sender QEvent event) {
  if (myevent ...) {
      .. do irgendwas
  }
}
(Beispiel nur stilisiert)
reagieren und auf die eigenen Events reagieren. Nicht vergessen, andernfalls die Basismethode super.event(...) aufzurufen.

Alternativ kann auch mit eventFilter auf die Events von anderen Empfängern oder Objekten reagiert werden. War es das was Du wissen wolltest ?

Gruß Arne
informat
Beiträge: 11
Registriert: 27. Juni 2008 18:53

Beitrag von informat »

Ja, genau das wars. Jetzt funktionierts auch Vielen Dank! :D
Antworten