Datenübertragung zwischen Threads

Alles rund um die Programmierung mit Qt
Antworten
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Datenübertragung zwischen Threads

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Kommt drauf an wie viel / was Du damit machen willst.
Möglich ist z.B. auch Signals/Slots
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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<>
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

@RHBaum: Einfach ein QByteArray und man muss sich über refs und ptr keine Gedanken machen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

@Christian,

Danke, ich probiere das mal aus.

cu, Bernd
--
Nachtrag: Danke natürlich auch an RHBaum.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Antworten