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 :

run() et polymorphisme [QtConcurrent]


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 29
    Par défaut run() et polymorphisme
    Bonjour,

    J'ai une classe abstraite, dont toutes les méthodes virtuelles pures sont redéfinies dans plusieurs classes dérivées.

    Je ne peux pas manipuler directement les classes dérivées, j'utilise donc un pointeur de la classe du type de la classe abstraite.

    Lorsque j'essaie d'utiliser QtConcurrent::run(), je me retrouve avec une erreur de compilation qui me dit en gros que je ne peux pas faire ça, car la fonction est virtuelle pure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /usr/.../qtconcurrentstoredfunctioncall.h:126: error: cannot declare field ‘QtConcurrent::StoredMemberFunctionCall0<short unsigned int, Protocole>::object’ to be of abstract type ‘Protocole’
    protocole.h:50: note: because the following virtual functions are pure within ‘Protocole’:
    ....
    protocole.h:153: note: virtual ushort Protocole::demandeAlarme()
    Est-ce totalement impossible d'utiliser QtConcurrent::run() dans ce cas?

  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.
    Peut tu mettre un peu de code?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 29
    Par défaut
    Désolé pour la réponse tardive.

    En fait, j'ai trouvé tout seul mon erreur.

    Je faisais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        // Protocole est une classe abstraite
        // Mode4 est dérivée de Protocole
        Protocole* cmdMode4 = new Mode4();
        QFuture<void> future = QtConcurrent::run(*cmdMode4, &Protocole::demandeAlarme);
    Alors que c'est le pointeur qui doit être passé a run(), et non l'instance de Protocole
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        QFuture<void> future = QtConcurrent::run(cmdMode4, &Protocole::demandeAlarme);
    Merci quand même de t'être penché sur mon problème

    Alors maintenant, j'ai un autre problème.

    En fait, si j'ai voulu mettre en place ceci, c'est parce que je dois communiquer avec des appareils par liaison série.
    J'ai mis en place une fonction qui envoie des commandes et qui attend la réponse.

    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
     
    QString Protocole::transaction(QString commande) {
        this->timerFini = false;
     
        QFile logTrames("logTrames.txt");
        logTrames.open(QFile::WriteOnly | QFile::Append);
        logTrames.write(commande.toAscii());
     
        emit(this->envoiTrame(commande));
        this->flagEtatCom = ETAT_ATTENTE;
        QTimer timerCommunication;
     
        timerCommunication.start(this->timeout);
        connect(timerCommunication,SIGNAL(timeout()),this,SLOT(timeoutCom()));
        // On attend timeout ms de recevoir la réponse
        while(this->flagEtatCom == ETAT_ATTENTE && !this->timerFini) {
            QCoreApplication::processEvents();
        }
        // Si pas de réponse
        if(this->timerFini) {
            emit(this->erreurTransmission());
            return NULL;
        }
        this->flagEtatCom = ETAT_REPOS;
        // Si erreur de commande
        if(this->trame.at(1)==NAK) {
            emit(this->erreurCommande());
            return NULL;
        }
        logTrames.write(trame.toAscii());
        logTrames.close();
     
        return this->trame;
    }
     
    // Slot de lecture d'une trame
    void Protocole::lectureTrame(QString data) {
        qDebug()<<"Trame reçue : " << data.toAscii();
        this->trame = data;
        this->flagEtatCom = ETAT_LECTURE;
    }
     
    // Slot appelé lorsque le timer de communication est fini
    void Protocole::timeoutCom() {
        this->timerFini = true;
    }
    La fonction demandeAlarme() appelle la fonction transaction() avec la commande appropriée.
    Avant que je ne fasse exécuter cette fonction par QtConcurrent::run(), cela ne marchait pas trop mal, mais j'avais des erreurs de segmentation lorsque l'application était fermée pendant la boucle d'attente, et le port série était mal fermé, ce qui entrainait une erreur d'ouverture lors de l'exécution suivante.

    Je me suis donc dis qu'exécuter ces fonctions dans un thread différent me permettrait de quitter proprement en vérifiant l'état de la communication dans le code de destruction de la fenêtre principale.

    Seulement, avec cette solution, le timeout() de QTimer ne marche plus et le programme se bloque dans la boucle...

    Que dois-je faire pour que ça marche? Ou est-ce qu'il y aurait une meilleure solution?

    Edit : Finalement, j'ai résolu mon problème en crééant une classe dérivée de QThread, et qui gère la connexion RS232 avec l'event loop. Je gère l'arrêt du thread grâce à un slot, ce qui me permet de fermer la communication proprement.

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

Discussions similaires

  1. [petites questions][debutant]run et mise en forme
    Par kurgan dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 22/10/2005, 17h40
  2. Réponses: 2
    Dernier message: 25/07/2004, 23h24
  3. [C#] [User] Simulation d'un "Run as"
    Par Vessaz dans le forum Windows Forms
    Réponses: 9
    Dernier message: 16/07/2004, 10h29
  4. [Thread]Faut-il boucler la méthode run ?
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 17/06/2004, 22h53
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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