QtConcurrent::run ,wie wirds benutzt ?

Alles rund um die Programmierung mit Qt
Antworten
Zephyr
Beiträge: 31
Registriert: 17. Februar 2009 14:29

QtConcurrent::run ,wie wirds benutzt ?

Beitrag 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.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Code: Alles auswählen

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

und

Code: Alles auswählen

emit mySignal(myNewMap);
in Thread2?
Zephyr
Beiträge: 31
Registriert: 17. Februar 2009 14:29

Beitrag 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.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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.
Zephyr
Beiträge: 31
Registriert: 17. Februar 2009 14:29

Beitrag 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.
MBex
Beiträge: 17
Registriert: 24. November 2007 11:36

Beitrag 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 ;-)
Antworten