2010-10-25 5 views
0

Je développe un logiciel d'acquisition d'image. Je veux exécuter la fonction d'affichage dans un fil séparé (pour assurer la vue en direct pour la capture d'image facile). Pour l'instant je sous-classe QObject, en créant DisplayObject et en utilisant la fonction QThread :: moveToThread. Le problème est que DisplayObject doit interagir avec l'interface graphique (les images doivent être affichées dans les objets QGraphicsView). Quelle est la meilleure (et la plus élégante) façon de faire cela?QThread interaction avec GUI

Ma solution actuelle:

class DisplayObject : public QObject 
{ 
    Q_OBJECT 
    public: 
     inline void addDetectorSystem(cci::PGR* system); 
     inline void connectGui(ImageAquisition* gui); 

    public slots: 
     void display(); 

    private: 
     cci::PGR* camSystem; 
     ImageAquisition* guiClass; 
}; 

DisplayObject est initialisé comme ci-dessous:

DisplayObject Displayer; 
     Displayer.addDetectorSystem(PGRSystem); 
     Displayer.connectGui(this); 
     QThread thread; 
     Displayer.moveToThread(&thread); 
     connect(this, SIGNAL(display()), &Displayer, SLOT(display())); 
     thread.start(); 

J'ai oublié d'admettre, que cela ne fonctionne pas ...

+0

Quelle est la portée de ce code: DisplayObject Displayer; Displayer.addDetectorSystem (PGRSystem); Displayer.connectGui (this); Fil QThread; Displayer.moveToThread (& thread); connect (ceci, SIGNAL (affichage()), & Displayer, SLOT (affichage())); thread.start(); –

+0

Ces initialisations sont incluses dans le constructeur de classe ImageAquisition (la classe GUI principale). – Marcin

Répondre

2

Vous pouvez utiliser QImage dans des threads non-UI. Cela vous permettrait de faire votre capture/dessin sur une image. Une fois qu'une image est prête à être affichée, vous pouvez alors émettre un signal avec l'image. Votre élément d'interface utilisateur doit avoir une fente connectée à ce signal qui prend l'image donnée et se rafraîchit pour dessiner cette image. En utilisant des signaux et des slots, les données doivent être transférées d'une manière sûre pour les threads. En utilisant QImages dans les autres threads, vous pouvez dessiner, et l'interface principale n'est responsable que de la mise à jour des images créées, au lieu de passer beaucoup de temps à les traiter.

+1

Voici un exemple de ce que Caleb a dit: http://qt-project.org/doc/qt-4.8/threads-mandelbrot.html –

1

En général, l'interface graphique est le fil principal et tout le travail est fait dans les discussions d'arrière-plan. Ceci est dû au fait que le thread principal doit gérer les événements mouse, redraw, iconify etc

La bonne chose à propos de Qt est que vous pouvez envoyer des slots/signaux entre les threads.

Voir threading in qt pour un aperçu.

Il y a aussi une bonne nouvelle advanced Qt book qui couvre threadign en détail