IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multithreading Discussion :

QextSerialPort et le multithreading avec QThread [QThread]


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut QextSerialPort et le multithreading avec QThread
    Bonjour à tous,

    Je cherche à intégrer qextserialport à une GUI.

    Je pense donc à un thread de qextserialport qui devra :
    - surtout pouvoir lire sur le port COM (et par la suite écrire) en continu ce que lui envoie un matériel embarqué,
    - parser le contenu
    - produire des signaux conditionnels personnalisés afin de reveiller le thread principal.

    J'ai suivi des tats de tutos et les exemples de qextserialport, que j'ai bien réussi à compiler, mais maintenant que je dois intégrer un thread de qextserialport par moi même, je dois dire que je sèche un peu.

    Je précise que je suis débutant en Qt C++, mais pas en programmation.

    Merci d'avance pour vos réponses !

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    qextserialport n'as pas un fonctionnement asynchrone?

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Merci de ta réponse Yan,

    En fait, j'ai vu dans un des exemples de qextserialport (qespta) que la lecture continue sur le port était effectuée par un Qthread.

    J'ai essayé de modifier par moi-meme cet exemple pour l'intégrer dans une GUI Qt du thread principal. J'arrive à récupérer le flux du port COM, mais je dois avoir un bug, car j'ai un usage processeur à 56% (un des threads doit etre planté...).

    Ca ne semble pas idiot de procéder avec un thread comme dans l'exemple, car j'aurai des algos qui pourront prendre un peu de temps dans le thread principal (calculs 3D...), et je voudrai que le parsage se fasse en continu sur l'autre thread.
    Mais je ne sais pas dans quel ordre déclarer tous ces modules (d'ou le bug je pense) :

    - Thread lecture port COM + parsage,
    - Thread principal contenant :
    o Interface graphique Qt (Boutons, affichage de graphiques des données du port COM par exemple (mais ce sera un autre post !)),
    o Fenêtre Ogre mise à jour à partir des données du port COM

    Qu'en pensez-vous ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par neoirto Voir le message
    Qu'en pensez-vous ?
    Si qextserialport as un fonctionnement synchrone il te faut un thread.

    Ce que tu propose est bien. Pour faire transiter les info entre tes threasd, je te conseil d'utiliser les signal/slot (sans pointeur en paramètre). Car ceci te permet d'avoir un fonction quasi sans risque. Y as des exemplse dans la doc de Qt (leur serveur de doc étant en rade je ne peux pas te donner les liens pour l'instant).

    Si qextserialport le permet tu pourrais éviter d'implémenter un thread. Regarde ces documents :
    http://qt-labs.developpez.com/#thread

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Ok, alors je progresse un peu...

    Désormais je crois mon thread lecture sur le port COM commence à fonctionner correctement. Mais je n'arrive pas à déclarer mes propres SIGNALS et SLOTS. Et surtout je ne sais pas comment y accéder depuis mes autres threads.

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    class SerialThread: public QThread
    {
    	QextSerialPort * port;
     
     
    	protected:
    		virtual void run()
    		{
     
    			int compteur_sans_com = 0;
     
    			qDebug("THREAD lecture COM : %i", (int)currentThreadId());
     
    			QextSerialPort * port = new QextSerialPort("COM6", QextSerialPort::EventDriven);
     
     
    			while(1){
     
    				/////////// si le port est ouvert, on lit les données :
    				if( port->isOpen() ){
     
     
    				Sleep(DELAI_lecture_port_COM); //////// pour eviter de surcharger ce thread et donc laisser les autres threads travailler
     
    				char data[4096];
     
    				int bytesRead = port->read(data, 4096);
    				data[bytesRead] = '\0';
     
    					////////////// si on a recu qq chose :
    					if( bytesRead > 0 ){
    					qDebug("%s ## %i", data, (int)currentThreadId());
    					// qDebug(" %i", (int)currentThreadId());
    					} else {
    					qDebug("RIEN %i", compteur_sans_com);
     
    						if (!(port->lineStatus() & LS_DSR)) {
     
    							compteur_sans_com++;
     
    							if( compteur_sans_com > NBR_sans_com_before_reopen_COM6 ){
    							compteur_sans_com = 0;
    							qDebug("On referme le port COM !!!");
     
    							port->close();
     
    							Sleep(10);
    							}
     
     
    						}
     
    					}
     
    				} else {
     
    							port = new QextSerialPort("COM6", QextSerialPort::EventDriven);
    							port->setBaudRate(BAUD9600);
    							port->setFlowControl(FLOW_OFF);
    							port->setParity(PAR_NONE);
    							port->setDataBits(DATA_8);
    							port->setStopBits(STOP_2);
    							port->open(QIODevice::ReadWrite);
    							port->setTimeout(500);
    							qDebug("On essai de reouvrir !! ");
     
     
    							Sleep(5000); ////////// la negociation avec le materiel peut prendre du temps 
     
    				}
     
    			}
     
    		}
     
     
     
    	signals:
    	  // Émet un entier
    	  void unEntier(int);
     
     
     
    	public slots:
     
          void close_COM()
          {
              qDebug("demande fermeture port com !!!");
    		  port->close();
          }
     
     
    }; 
     
     
     
     
     
     
    int main(int argc, char *argv[])
    {
     
    	int exec;
     
    	QApplication app(argc, argv);
        //redirect debug messages to the MessageWindow dialog
    	qInstallMsgHandler(MessageWindow::AppendMsgWrapper);
     
    	MainWindow mainWindow(APP_TITLE);
    	mainWindow.show();
     
     
    	qDebug("THREAD MAIN : %i", (int)QThread::currentThreadId());
     
    	// SerialThread * thread = new SerialThread(port);
    	SerialThread * thread = new SerialThread();
    	app.connect(thread, SIGNAL(finished()), & app, SLOT(quit()));
     
     
     
     
        QPushButton BOUTON_CLOSE_COM("Fermer COM");
        BOUTON_CLOSE_COM.resize(75, 30);
        BOUTON_CLOSE_COM.setFont(QFont("Times", 15, QFont::Bold));
     
        app.connect(&BOUTON_CLOSE_COM, SIGNAL(clicked()), thread, SLOT(close_COM()));
     
    	BOUTON_CLOSE_COM.show();
     
    	thread->start();
     
     
    	exec = app.exec();
     
    	return exec;
    }
    Par exemple je n'arrive pas à executer le slot close_COM depuis BOUTON_CLOSE_COM.

    Et comment est-ce que je dois faire pour declencher le slot depuis ma classe
    MainWindow please ?

    Merci d'avance !

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Si tu commence avec Qt, je te conseil de commencer par les tuto ou du moins de faire un tours rapide :
    http://qt.developpez.com/tutoriels/introduction-qt/

    Sinon, regarde ces deux liens :
    http://qt.developpez.com/faq/index.p...ots#signalslot
    http://qt.developpez.com/faq/index.p...ECT-moc-header

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Multithreading avec section critique ?
    Par Cokate dans le forum C#
    Réponses: 8
    Dernier message: 25/08/2008, 16h05
  2. Lancer une application multithread avec msdos
    Par SpIrIt505050 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 11/06/2008, 19h47
  3. Multithread avec partage de ressources et join
    Par Razgriz dans le forum Langage
    Réponses: 4
    Dernier message: 09/05/2008, 10h41
  4. Multithreading avec Visual Basic pour Access
    Par NoViceDel dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/10/2006, 21h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo