[gelöst] Threads und Netzwerkübertragung
[gelöst] Threads und Netzwerkübertragung
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
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.
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)
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)
-
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
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
gesendet, dass ist auf alle Fälle threadsicher und funktioniert einwandfrei
Gruß Arne
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(..)
Gruß Arne
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:
an die Stelle im Thread geschrieben sowie eine Methode
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
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));
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());
}
}
}
}
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
Ich habe die Zeile im lokalen Thread jetzt zu:
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...
Code: Alles auswählen
QApplication.sendEvent(this, new MyEvent(QEvent.Type.CustomEnum, request, out, socket));
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...
-
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
Also der Empfänger (in diesem Falle this) kann auf das Event in der abgeleiteten Methode
(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
Code: Alles auswählen
boolean event(QObject sender QEvent event) {
if (myevent ...) {
.. do irgendwas
}
}
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