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 :

Eviter le multi tache?


Sujet :

Multithreading

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut Eviter le multi tache?
    Bonjour a tous,

    Je developpe une toute petite application qui est charge de lire des donnees sur le port serie.
    Mon programme fonctionne correctement mais mon probleme est que j'ai utilise un boutton pour faire une lecture du port ce qui n'est pas tres pratique.

    Ayant quelques vagues notions de multitaches je me suis dit que faire une tache qui se reveillerait sur l'arrive d'un message sur le port pourrait etre une solution mais apres avoir essayer de lire la doc de Qt je dois dire que je me suis un peu decourage

    J'en appelle a vos connaissances, est-il possible de lire en temps reel les informations arrivant sur mon port sans passer par du multi tache?

    Et si non, si vous avez quelques indications pour debuter le multitache? Je tiens a preciser que j'ai appris le multitache a l'ecole avec un noyau perso donc j'ai peut etre quelques mauvaises habitudes.

    Merci d'avance et excusez moi pour les accents j'utilise un clavier qwerty

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut
    Citation Envoyé par Fanta310 Voir le message
    J'en appelle a vos connaissances, est-il possible de lire en temps reel les informations arrivant sur mon port sans passer par du multi tache?
    Tu pourrai utiliser un QTimer pour utiliser le signal timeout et faire la lecture a temps régulier. Le problème est que si la lecture est longue ou bloquante, ton ihm va freezer

    Et si non, si vous avez quelques indications pour debuter le multitache? Je tiens a preciser que j'ai appris le multitache a l'ecole avec un noyau perso donc j'ai peut etre quelques mauvaises habitudes.
    La doc de QTread et les exemple. Regarde sur le forum tu trouvera quelque discution. Tu peut toujours poster des question ici

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    "Note that QCoreApplication::exec() must always be called from the main thread (the thread that executes main()), not from a QThread. In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations."

    Je n'ai jamais creer de classes contenant le main dois-je juste remplacer mon QApplication par QCoreApplication dans le main, tout simplement?

    Donc d'apres ce que j'ai compris les taches sont creees comme des classes? Y'a t'il une notrion de prioriter et/ou de quotas de temps avec Qt?


    Pour resumer, mon main se resumerait a :
    int main (int argc, char *argv[]){

    QCoreApplication app(argc, argv);

    FenPrincipale maFenetre;
    maFenetre.show();

    return app.exec;
    }

    Et ma classe FenPrincipale qui serait une tache qui gere mon IHM donc serait une boucle infinie, je peux donc verifier la reception de message lorsque j'ouvre le port.

    Lorsque je recois un message je reveil la tache pour la lire et j'envois le message recupere a mon IHM qui l'affichera dans un QTextEdit.

    Ca a l'air coherent?

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Rebonjour a tous,

    Voila comment j'ai pris mon probleme :

    . Dans mon main j'ai remplacer le QApplication par QCoreApplication.

    . J'ai modifier ma classe MyPort (qui lit le port) et j'ai ajouter : QThread dans sa liste d'heritage. J'ai mis la partie concernant la lecture du port dans la fonction run()

    . Dans ma classe FenPrincipale (qui gere l'IHM) lorsque je clic une fois sur le bouton "lire le port" je fait my_port->start(QThread::HighPriority). Sachant que my_port est un pointeur de la classe MyPort et appartient a la classe FenPrincipale.

    Cela est-il suppose fonctionner ou je fais totalement fausse route car pour le moment ca ne compile pas

    error: within this context 'QThread' is not an accessible base of 'MyPort'

    Merci de votre aide

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    La tu n'as pas compris....
    as tu regardé un peu cette exemple
    http://qt.developpez.com/doc/latest/...andelbrot.html

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    As tu réussi ce que tu voulais faire??

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Je pense avoir bien avance mais tout ne fonctionne pas encore parfaitement.

    Voila ou j'en suis : j'ai une tache principale qui tourne en permanance et attends de recevoir un message.
    Si il recoit le message j'ai essayer d'appeler une fonction avec un slot pour mettre a jour le QTextEdit mais le programme crash lorsque j'envois une trame.

    J'ai pense de baisser la priorite ma tache principale et au lieux d'appeller une methode normale j'appelerais une autre tache de tres haute priorite qui ne serait pas en boucle infinie donc je suis sur que celle-ci s'execute et plus l'autre.

    Mais apparament je ne peux pas utiliser de thread dans ma fenetre principale ?
    Je crois que c'est ma tache de reception de la trame qui me fait planter,

    Voici les codes si qqn a le courage de jetter un coup d'oeil et vois quelque chose de faux :

    Myport.h
    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
    #ifndef MYPORT
    #define MYPORT
     
    #include <qextserialport.h>
    #include <QThread>
    #include <QTextEdit>
    #include <QString>
    #include <iostream>
     
    class QextSerialPort;
     
    class MyPort :  public QThread
    {
     	Q_OBJECT
     
    	public:
      		MyPort();
     		QString getReceived_msgTxt(void) const;
     
     	protected:
    		void run(void);
     
    	private:
     	 	QextSerialPort *port;
      		QTextEdit *received_msg;
      		QString text;
     
    	public slots:
      		void closePort();
      		void openPort();
     
      	signals:
      		void MonSignal(void);
    };
     
    #endif
    et MyPort.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
    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
    #include "MyPort.h"
     
    MyPort::MyPort(): QThread(){
     
      port = new QextSerialPort("/dev/ttyS0");
      port->setBaudRate(BAUD9600);   
      port->setFlowControl(FLOW_OFF);
      port->setParity(PAR_NONE);    
      port->setDataBits(DATA_8);   
      port->setStopBits(STOP_2);    
     
      received_msg = new QTextEdit("empty");
      QString text();  
    }
    void MyPort::closePort(){
    	port->close();
    }
     
    void MyPort::openPort(){
    	port->open(QIODevice::ReadWrite);
    }
     
    void MyPort::run(){
      	char buff[2048]={0};
      	int numBytes;
     
      	while(1){
    		numBytes = port->bytesAvailable();
    		if(numBytes > 0){
    	    	if(numBytes > 2048) numBytes = 2048;
     
    	    	int i = port->read(buff, numBytes);
    			buff[i] = '\0';
    			text.append(buff); 
    	    	received_msg->setPlainText(text);
    	    	emit MonSignal();
    	    	text.clear();
    		}
      	}
    }
     
    QString MyPort::getReceived_msgTxt(void) const{
    	return received_msg->toPlainText();
    }

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Du nouveau, quand je lance mon programme en mode console, j'ai ce message d'erreur :

    ASSERT failure in QApplication::sendEvent: "Cannot send events to
    objects owned by a different thread. Current thread 8094d78. Receiver '' (of type
    'QTextDocument') was created in thread 80542d0", file kernel/qapplication.cpp,
    line 269
    Aborted (core dumped)

    On m'a conseiller d'utiliser QObject::moveToThread mais je comprends pas trop

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    Tu as quelque petit problème dans ton code :
    1- Jamais d'ihm dans une thread donc pas de QTextEdit
    2- Il faut comprendre que ce qui appartient à la thread se trouve dans le run et pas ailleur. Donc ceci devrait être dans le run
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     port = new QextSerialPort("/dev/ttyS0");
      port->setBaudRate(BAUD9600);   
      port->setFlowControl(FLOW_OFF);
      port->setParity(PAR_NONE);    
      port->setDataBits(DATA_8);   
      port->setStopBits(STOP_2);
    3- tu devrait emettre un signal avec une QString
    4- tu utilise port hors de la thread (cf 2), il te faut donc un mutex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void MyPort::closePort(){
    	port->close();
    }
     
    void MyPort::openPort(){
    	port->open(QIODevice::ReadWrite);
    }
    5- il te faudrait une possibilité de sortir du while

    Sinon c'est le principe

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    1. Corrige!
    2. Je pense pas que cette partie aie sa place dans mon thread, je connect mon port avec un bouton et je surveille avec un autre (qui lance mon run)
    3. Corrige!
    4. Joker
    5. J'ai un bouton pour fermer le port et donc arreter le thread

    La connexion fonctionne, cependant de temps en temps je ne recois pas le message en entier c'est etrange!

Discussions similaires

  1. application multi taches
    Par tiagocerqueira dans le forum Qt
    Réponses: 1
    Dernier message: 26/05/2010, 10h05
  2. Temps réel, multi tache, synchronistation
    Par Invité dans le forum Ada
    Réponses: 8
    Dernier message: 07/09/2009, 19h20
  3. Calcul parallèles et multi taches !
    Par Darktrouble dans le forum Débuter
    Réponses: 1
    Dernier message: 03/03/2008, 15h29
  4. [Conception] Eviter les multi pages
    Par thephpman dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/04/2007, 00h16
  5. [Thread]multi-tache
    Par nick1000 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 14/06/2005, 09h10

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