Bonjour à tous,

Je me suis renseigné sur la façon d'utiliser un QThread pour faire du multithread dans mon logiciel.

Il faut créer une classe concernant l'instanciation d'un QThread.

J'aimerais faire marcher un thread en permanence scrutant son entrée standard pour voir si une action est ordonnée par un utilisateur sur un bouton (pour un type d'acquisition : unique, continue ou stop).
Je pense que c'est une bonne solution plutôt que de recréer à chaque appuie sur un bouton un nouveau thread.

Projet :
-communcation_spectro.h hérite de QThread :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    class Communication_spectro : public QThread  
    {  
        Q_OBJECT  
    public:  
        Communication_spectro()  
        {  
           // Fait en sorte que les slots de ce thread soit exécutés dans ce thread  
           // moveToThread ne marche que sur les QObject sans parent  
           setParent(0);  
           moveToThread(this);  
        }  
 
        void run()  
        {  
            Communication();  
            // On lance une boucle d'événement pour que  
            // les slots fonctionnent et soient exécutés  
            // dans le thread  
            exec();  
        }  
 
        int index =0;  
        int error=0;  
        unsigned long integrationTimeMicrosec = 1000000;  
        int nb_pixels;  
 
        double nanometre[1024];  
        double intensite[1024];  
 
    protected:  
    // On met le slot en private pour éviter de pouvoir  
    // l'appeler comme une fonction normale  
    private slots:  
        void Communication()  
        {  
            SeaBreezeWrapper *obj1 =  SeaBreezeWrapper::getInstance();  
 
            obj1->openSpectrometer(index,&error);  
 
            nb_pixels = obj1->getFormattedSpectrumLength(index,&error);  
 
            obj1->setIntegrationTimeMicrosec(index,&error,integrationTimeMicrosec);  
 
            obj1->getWavelengths(index,&error,nanometre,nb_pixels);  
 
            obj1->getFormattedSpectrum(index,&error,intensite,nb_pixels);  
 
            obj1->closeSpectrometer(index,&error);  
 
            for (int i=0; i<nb_pixels; i++)  
            {  
                printf("%lf ; %lf\n",nanometre[i],intensite[i]);  
            }  
 
            fflush(stdout);  
 
            emit Communication_signal();  
        }  
 
    signals:  
        void Communication_signal();  
 
    }
-mainwindow.h hérite de QMainWindow

-main.cpp :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    #include <QThread>  
    #include <QDebug>  
 
    int main(int argc, char *argv[])  
    {  
        QApplication a(argc, argv);  
 
        //qDebug() << QThread::currentThreadId() << "Main Thread";  
        Communication_spectro *thread = new Communication_spectro();  
        thread->start();  
        //qDebug() << QThread::currentThreadId() << "Am I still here?";  
        //thread->run();  
 
        MainWindow w;  
        w.show();  
 
        return a.exec();  
    }
-mainwindow.cpp :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
    MainWindow::MainWindow(QWidget *parent) :  
        QMainWindow(parent),  
        ui(new Ui::MainWindow)  
    {  
        ui->setupUi(this);  
 
        connect(ui->bouton1, SIGNAL(clicked(bool)), ui->bouton2, SLOT(setEnabled(bool)) );  
        connect(ui->bouton2, SIGNAL(clicked(bool)), ui->bouton1, SLOT(setEnabled(bool)) );  
        connect(ui->bouton2, SIGNAL(clicked(bool)), Communication_spectro::thread, SLOT(Communication()));  
        //obj1 =  SeaBreezeWrapper::getInstance();  
    }
-mainwindow.ui

-----------------------------------

J'aimerais faire marcher un thread en permanence scrutant son entrée standard pour voir si une action est ordonnée par un utilisateur sur un bouton (pour un type d'acquisition : unique, continue ou stop). Je pense que c'est une bonne solution plutôt que de recréer à chaque appuie sur un bouton un nouveau thread.

Problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
connect(ui->bouton2, SIGNAL(clicked(bool)), Communication_spectro::thread, SLOT(Communication()));  
 
-> erreur : invalid use of non-static member function 'QThread* QObject::thread() const'
Solution :
Mettre la classe Communication_spectro en héritage de MainWindow ? -> le souci c'est que je ne suis pas sur que ça puisse marcher pour le multithread.