Seite 1 von 1

Datenübertragung zwischen Threads

Verfasst: 12. Oktober 2007 10:22
von bst
Hallo,

ich bekomme regelmäßig einige KB's Daten über TCP/IP die ich an einen anderen Thread weiterleite. Momentan benutze ich dazu (mehrere) QLists.

Wäre es sinnvoll hier auf QByteArrays oder QQueues zu wechseln?

cu, Bernd

Verfasst: 12. Oktober 2007 10:53
von Christian81
Kommt drauf an wie viel / was Du damit machen willst.
Möglich ist z.B. auch Signals/Slots

Verfasst: 15. Oktober 2007 10:44
von bst
Morgen,

im Prinzip mache ich das jetzt so, gdList ist ein QList, gd ist eine Struktur mit z.Zt. ca. 30 Bytes, später vermutlich mal 30 * 2 Bytes.

im TCP/IP Thread:

Code: Alles auswählen

while (GrafikDatenImTelegramm) { // 1-200, typisch ca. 1-5
   // dekodieren und in Struktur gd schreiben
   mutex.lock();
   gdList[station] << gd;
   mutex.unlock();
}
emit GraphDataChanged(station);
und im anderen Thread:

Code: Alles auswählen

   mutex.lock();
   for (j = 0; j < gdList[station].size(); j++ )
      myData[station]->append(&gdList[station].at(j), 1);
   gdList[station].clear();
   mutex.unlock();
Ist das mit einer QList prinzipiell OK oder sollte ich hier auf eine Queue oder ein Array o.ä. umstellen, in welchem nicht immer neue Elemente angelegt/gelöscht werden müssten?

P.S. Habe keine automatische Antwort-Benachrichtigung erhalten?

cu, Bernd

Verfasst: 15. Oktober 2007 13:21
von Christian81
Prinzipiell ist es ok, aber total unnötig. Ich würde im TCP/IP thread einfach ein Signal mit den Daten losschicken und es im verarbeitenden Thread auffangen und weiterverarbeiten. Damit entfällt der Mutex und die globale QList<>

Verfasst: 15. Oktober 2007 14:45
von RHBaum
Ich würde im TCP/IP thread einfach ein Signal mit den Daten losschicken
Aehm bei einem signal ueber threadgrenzen laeuft das doch assynchron, sprich dein emit wird in ne queue gestellt und kommt sofort wieder zurueck.

Wenn er dabei die daten kopiert (kein zeiger keine referenz in der Signatur des Signals) mag das gehen.
bei 2*30 Byte kann man noch streiten was effektiver ist, der lock oder die copy.

empfaengt er aber bloecke von seiner struktur, was bei TCP/IP gar ned mal so abwegig ist, wird er um die locks ned drumherumkommen.

Ciao ...

Verfasst: 15. Oktober 2007 16:19
von Christian81
@RHBaum: Einfach ein QByteArray und man muss sich über refs und ptr keine Gedanken machen.

Verfasst: 15. Oktober 2007 16:40
von bst
@Christian,

Danke, ich probiere das mal aus.

cu, Bernd
--
Nachtrag: Danke natürlich auch an RHBaum.

Verfasst: 15. Oktober 2007 16:56
von RHBaum
Einfach ein QByteArray und man muss sich über refs und ptr keine Gedanken machen.
Also ich mich mir da schon gedanken, aber ned um die Daten sondern um die performance ^^
da iss mindestens 1 kopie dabei ..., bei QbyteArray ist das definitiv 1 new (oder irgendwas aehnliches)

Ciao ...