[gelöst] Zugriff aus Thread auf Daten vom parent-Objekt
[gelöst] Zugriff aus Thread auf Daten vom parent-Objekt
Hiho,
ich hab einen kleinen TCP-Aufbau basierend auf dem Threaded Fortuneserver aus den QT-Examples.
Dort ruft ja der FortuneServer die FortuneServerThreads auf.
Bei mir hat der Server nun z.B. ein Array aus QStrings "swMatrix". Auf die Inhalte dieses Arrays möchte ich aus den Threads heraus zugreifen.
In dem Array stehen z.B. Ip-Addressen von Geräten, mit denen der Server kommuniziert (ioLogik-Schalter). Und ich möchte nun z.B., dass jeder Client, der sich an dem Server anmeldet eine Liste der verfügbaren IP-Adressen mitgeteilt bekommt.
Wie würdet ihr das realisieren?
Danke und Gruß
meph
ich hab einen kleinen TCP-Aufbau basierend auf dem Threaded Fortuneserver aus den QT-Examples.
Dort ruft ja der FortuneServer die FortuneServerThreads auf.
Bei mir hat der Server nun z.B. ein Array aus QStrings "swMatrix". Auf die Inhalte dieses Arrays möchte ich aus den Threads heraus zugreifen.
In dem Array stehen z.B. Ip-Addressen von Geräten, mit denen der Server kommuniziert (ioLogik-Schalter). Und ich möchte nun z.B., dass jeder Client, der sich an dem Server anmeldet eine Liste der verfügbaren IP-Adressen mitgeteilt bekommt.
Wie würdet ihr das realisieren?
Danke und Gruß
meph
Zuletzt geändert von mephistho am 19. September 2007 15:22, insgesamt 3-mal geändert.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Danke, das dachte ich mir eigentlich auch. Aber ist das nicht schon mit der Übergabe von "this" als parent realisiert?
So kann ich aber nicht mit parent-> auf meine Daten zugreifen
ioserverthread Zeile 22:
Das gibt folgende Fehlermeldung. Egal ob mit & oder ohne...
Oder brauch ich explizit nen Pointer auf den HauptTHREAD, in dem mein ioServer läuft, was dann ja der Hauptthread der ganzen Anwendung wäre?! Wie würd ich da rankommen?
Dank & Gruß
meph
Code: Alles auswählen
void ioServer::incomingConnection(int socketDescriptor)
{
ioServerThread *thread = new ioServerThread(socketDescriptor, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
Code: Alles auswählen
ioServerThread::ioServerThread(int socketDescriptor, QObject *parent)
: QThread(parent), socketDescriptor(socketDescriptor)
{
}
ioserverthread Zeile 22:
Code: Alles auswählen
text = QString(&parent->swMatrix[0][0] + " <-> " + &parent->swMatrix[0][1]);ioserverthread.cpp:22: error: invalid use of member (did you forget the ‘&’ ?)
ioserverthread.cpp:22: error: base operand of ‘->’ is not a pointer
ioserverthread.cpp:22: error: invalid use of member (did you forget the ‘&’ ?)
ioserverthread.cpp:22: error: base operand of ‘->’ is not a pointer
Oder brauch ich explizit nen Pointer auf den HauptTHREAD, in dem mein ioServer läuft, was dann ja der Hauptthread der ganzen Anwendung wäre?! Wie würd ich da rankommen?
Dank & Gruß
meph
Zuletzt geändert von mephistho am 19. September 2007 09:25, insgesamt 2-mal geändert.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Wenn wir jetzt noch wüssten wo ioserverthread.cpp:22 ist, könnten wir wohl auch helfen.
Ich würde mal sagen dass "&parent" sinnlos ist - ein Ptr auf einen Ptr geht an dieser Stelle recht schlecht... ggf. hast Du da ein paar Klammern vergessen.
Den Parent als QObject * parent zu übergeben ist zwar ok, aber imho (bin mir nicht mehr ganz sicher) gibt es dann ggf. Warnungen/Probleme zur Laufzeit. Der Parent eines QThreads sollte immer 0 sein. Ich finde gerade den Post nicht mehr und es kann auch sein dass ich mich in diesem Punkt irre.
Ich würde mal sagen dass "&parent" sinnlos ist - ein Ptr auf einen Ptr geht an dieser Stelle recht schlecht... ggf. hast Du da ein paar Klammern vergessen.
Den Parent als QObject * parent zu übergeben ist zwar ok, aber imho (bin mir nicht mehr ganz sicher) gibt es dann ggf. Warnungen/Probleme zur Laufzeit. Der Parent eines QThreads sollte immer 0 sein. Ich finde gerade den Post nicht mehr und es kann auch sein dass ich mich in diesem Punkt irre.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Hab den Post oben editiert. Zeile 22 ist die Zeile, in der &parent-> aufgerufen wird...
Die Übergabe als QObject* wirft keine Warnungen aus. Habs so auch aus dem QT-Example übernommen.
Hilfst mir mal kurz auf die Sprünge mit der Syntax zur Pointerübergabe?! Ich hab da in den letzten Tagen so viel ausprobiert, dass ich grad nich mehr weiß, wie ich das normalerweise lösen müsste.
Danke!
Die Übergabe als QObject* wirft keine Warnungen aus. Habs so auch aus dem QT-Example übernommen.
Hilfst mir mal kurz auf die Sprünge mit der Syntax zur Pointerübergabe?! Ich hab da in den letzten Tagen so viel ausprobiert, dass ich grad nich mehr weiß, wie ich das normalerweise lösen müsste.
Danke!
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
swparent?
swMatrix ist ein Array aus QStrings, ja. Aber parent->swMatrix[0][0] geht ebenfalls nicht. Gleicher Fehler wie bei &parent->swMatrix[0][0]:
swMatrix ist ein Array aus QStrings, ja. Aber parent->swMatrix[0][0] geht ebenfalls nicht. Gleicher Fehler wie bei &parent->swMatrix[0][0]:
ioserverthread.cpp:22: error: invalid use of member (did you forget the ‘&’ ?)
ioserverthread.cpp:22: error: base operand of ‘->’ is not a pointer
ioserverthread.cpp:22: error: invalid use of member (did you forget the ‘&’ ?)
ioserverthread.cpp:22: error: base operand of ‘->’ is not a pointer
So, ich denke, ich habs gelöst.
Ich erweitere meine ioServerThread-Klasse um ein
und übergebe einen Pointer auf ioServer beim Aufruf der Klasse.
Dann kann ich im Konstruktor von ioServerThread den übergebenen Pointer in meinen tmpServer packen und in der Klasse drauf zugreifen.
Dann aber vielleicht noch was anderes, wofür sich ein eigener Thread vermutlich gar nicht lohnt:
Mein Client, der nun wunderbar Daten übermittelt bekommt, verliert nach 30 Sekunden die Verbindung. Ich weiß grad noch nich, obs am Server liegt, oder am Client.
Fällt euch (dir Christina81) auf die Schnelle ein, ob da in den Tcp-Sachen von Qt irgendwo n Standard-Timeout drinstecken könnte?
Dank & Gruß
meph
Ich erweitere meine ioServerThread-Klasse um ein
Code: Alles auswählen
private: ioServer *tmpServer;Code: Alles auswählen
void ioServer::incomingConnection(int socketDescriptor)
{
ioServerThread *thread = new ioServerThread(socketDescriptor, this, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
Code: Alles auswählen
ioServerThread::ioServerThread(int socketDescriptor, ioServer *ios, QObject *parent)
: QThread(parent), socketDescriptor(socketDescriptor)
{
tmpServer = ios;
}
Mein Client, der nun wunderbar Daten übermittelt bekommt, verliert nach 30 Sekunden die Verbindung. Ich weiß grad noch nich, obs am Server liegt, oder am Client.
Fällt euch (dir Christina81) auf die Schnelle ein, ob da in den Tcp-Sachen von Qt irgendwo n Standard-Timeout drinstecken könnte?
Dank & Gruß
meph
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Verdammt, alle 30sek Verbindungsabbruch geht mal gar nich. Und zumindest auf dem Linux-System, auf dem die Serveranwendung läuft, bekomm ich keine Meldung inner Konsole, wie es sonst der Fall ist, wenn was schiefläuft.
Hm, QMutex. Da hab ich noch nie mit gearbeitet.
Evtl. komme ich aber auch ohne aus. Weil eigentlich immer gesichert ist, dass jeder Client immer nur die Daten verändert, die "ihm" gehören - in Abhängigkeit von den IPs.
Obwohl, da bin ich auch auf dem Holzweg, oder? Wenn zwei Clients gleichzeitig auf verschiedene Felder des Arrays zugreifen crasht das genau so, als wenn sie beide auf das selbe Feld zugreifen würden, richtig?
Hm, QMutex. Da hab ich noch nie mit gearbeitet.
Evtl. komme ich aber auch ohne aus. Weil eigentlich immer gesichert ist, dass jeder Client immer nur die Daten verändert, die "ihm" gehören - in Abhängigkeit von den IPs.
Obwohl, da bin ich auch auf dem Holzweg, oder? Wenn zwei Clients gleichzeitig auf verschiedene Felder des Arrays zugreifen crasht das genau so, als wenn sie beide auf das selbe Feld zugreifen würden, richtig?
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Das ist fein. Dann sollte das bei mir klappen.Christian81 hat geschrieben:Es crasht nur wenn genau die gleichen Daten verändert werden.
Der Verbindungsabbruch ist mir auch völlig suspekt. Da muss ich mir erst mal was zur Fehlereingrenzung einfallen lassen. Bin für Denkanstöße auf jeden Fall dankbar