Seite 1 von 1

QtConcurrent::run ,wie wirds benutzt ?

Verfasst: 11. März 2009 16:44
von Zephyr
Hi@all

Ich habe mir die Dokumentation zu QtConcurrent durchgelesen ,ich möchte vorweg aber mein Szenario erläutern...


Ich habe eine von QWidget abgeleitete Klasse in der ich bilder darstellen kann.(Diese wird selbstverständlich in der main erstellt und angesprochen)

über "addWindow(QMap<QString,QVariant>)" kann ich eine QMap an die klasse schicken.

In dieser QMap stehen informationen wie das Bild aussehen muss ...



Nun besitze ich aber einen 2ten Thread um Netzwerkpakete entgegenzunehmen aus dem ich die Qmap bekomme.

Mir ist klar dass ich nichts aus der Gui klasse über einen seperaten Thread ohne zusätzliche Mittel ansprechen kann.

Da kommt QtConcurrent ins Spiel.

mit QtConcurrent::run kann ich nun eine funktion aus einem anderem Thread aufrufen.

Da endet mein Verständnis , leider finde ich nur wenig brauchbare Informationen aus dem Netz.

Deswegen wollte ich hier mal nachfragen ob jemand eine Idee hat wie man so etwas realisiert.



Um es noch mal zusammenzufassen:

Ich besitze 2 Thread.

In Thread 2 bekomme ich die QMap ,diese muss an Thread 1 geschickt werden.


Ich würde mich freuen wenn da jemand ist der mir helfen kann bei diesem Problem weil ich keine Ahnung habe wie es jetzt weiter gehen soll.

Verfasst: 11. März 2009 17:16
von pfid

Code: Alles auswählen

::onNewMap(QMap myNewMap)
{
}
in thread 1

und

Code: Alles auswählen

emit mySignal(myNewMap);
in Thread2?

Verfasst: 11. März 2009 18:22
von Zephyr
Danke für deine Hilfe aber leider verstehe ich nicht was damit gemeint ist.

Das sieht ja eher nach signals und slots aus ,das hate ich ja auch erst geplant aber über die Qt::Concurrent Klasse sollte das ganze etwas performanter sein.

Verfasst: 12. März 2009 08:26
von pfid
Ich versteh momentan nur nicht, wozu du QtConcurrent brauchst. Was genau ist an Signals & Slots zu langsam?

Du schreibst "mit QtConcurrent::run kann ich nun eine funktion aus einem anderem Thread aufrufen". Imho ist es aber eher so, dass die übergebene Funktion in einem eigenen Thread (also nebenläufig) ausgeführt wird.

Verfasst: 12. März 2009 08:50
von Zephyr
ein zusätzliches problem ist dass die events(Signals ,Slots) nicht funktionieren ,ich weiß nicht woran es liegt und arbeite an einer Lösung.


leider darf ich nicht allzuviel vom programm ausplaudern



Edit:

also das Problem mit den Events scheint an der QueuedConnection zu liegen ,setze ich das enum auf diesen wert wird die aktion nie ausgeführt ... ,über DirectConnection habe ich das selbe Problem wie vorher ,ich kann ja nicht einfach Threads übergreifend Gui-Elemente ansprechen.

Verfasst: 12. März 2009 22:27
von MBex
Das Object in dem Thread, welches die Signale entgegennimmt, muss in dem Thread erstellt werden oder aber dorthin übergeben werden mit moveToThread(). Im Konstruktor vom Thread das Object zu erstellen reicht hier nicht aus, da er aus dem haupt Thread aufgerufen wird. Weiß ja nicht wie das bei dir aussieht, aber das Problem, wie du es beschreibst, hatte ich auch und wurde durch das Verschieben des Objects in den Thread gelößt.

Hoffe ich konnte helfen und hab nichts falsches erzählt ;-)