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 :
-mainwindow.h hérite de QMainWindow
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(); }
-main.cpp :
-mainwindow.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.ui
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(); }
-----------------------------------
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 :
Solution :
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'
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.
Partager