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

Qt Discussion :

Exécution de deux fonctions en parallèle


Sujet :

Qt

  1. #1
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut Exécution de deux fonctions en parallèle
    Bonjour,
    j'ai un petit problème très simple à comprendre mais assez complexe à résoudre.

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::sleep(int time)
    {
        dieTime = QTime::currentTime().addMSecs(time);
        while (QTime::currentTime() < dieTime)
            QCoreApplication::processEvents(); // (QEventLoop::AllEvents, 100)
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void MainWindow::button_test1()
    {
        while(true)
        {
            this->write("test 1", "console");
            this->sleep(1000);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MainWindow::button_test2()
    {
        int nb = 0;
        while(nb < 10)
        {
            this->write("test 2", "console");
            this->sleep(1000);
            nb++;
        }
    }
    Quand j'appuis sur le bouton test2 après le bouton test1, le bouton test1 se stop, le bouton test2 écrit 10 fois "test 2" et seulement à la fin le bouton test1 reprends l'écriture de "test 1" dans la console de mon application.

    N'y a-t'il pas un moyen pour que button_test1 et button_test2 s’exécute en même temps en prenant le relais durant le sleep ?

    La seul solution est-elle de passer par des threads ???

    Merci d'avance,
    Matthieu

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 586
    Points : 7 724
    Points
    7 724
    Par défaut
    Bonjour,

    Par définition les actions se déroulent sur the thread gérant l'UI. Etant sur le même thread ils sont forcements successifs.
    Dans ce cas 'simple' avec des délais d'attente, il est possible de permettre un parallélisme en découpant le traitement (le plus natarel serait d'utiliser des timers).
    Si par contre les délais représentent des véritables actions que tu souhaites en parallèle, là comme il s'agit d'avoir du CPU en parallèle ; une seule possibilité les threads.

  3. #3
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut re
    Justement, c'est pas ce qui est déjà fait dans la fonction sleep ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QCoreApplication::processEvents();
    Cette instruction permet déjà de redonner la main à l'UI ce que me permet d'apuyer sur le 2e bouton.

    Si je comprends bien, durant ce sleep je dois redonner la main aux fonctions en cours d'exécution (ici button_test1) ?
    En faite je croyais que mon sleep le fessait déjà.

    Il n'y a pas de moyen simple de faire ça juste en rajoutant quelque chose dans le while de mon sleep ???

  4. #4
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut re
    Oui, il s'agit d'une véritable pause.
    Tu peux me montrer comment utiliser un timer dans ma fonction sleep() stp ?

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 586
    Points : 7 724
    Points
    7 724
    Par défaut
    La fonction pause suspend le thread et donne la main aux autres threads. Ici les deux actions utilisant le même ne peuvent que s'exécuter une après l'autre.
    Je ne connais pas du tout Qt, je prends juste un exemple Qt que j'essaie d'adapter (et j'ai supposé que MainWinddow n'est instanciée qu'une fois d'où des QTimer et une variable n en static)
    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
    void MainWindow::button_test1() {
        static QTimer *timer1 = 0;
        if ( timer1 == 0 ) {
            timer1 = new QTimer( this );
            connect( timer1, SIGNAL(timeout()), this, SLOT(test1_cyclique()) );
        }
        timer1->start( 1000 );
    }
    void MainWindow::test1_cyclique() {
        this->write( "test 1", "console" );
    }
    static QTimer *timer2 = 0;
    void MainWindow::button_test2() {
        if ( timer2 == 0 ) {
            timer2 = new QTimer( this );
            connect( timer2, SIGNAL(timeout()), this, SLOT(test2_cyclique()) );
        }
        if ( !timer2->isActive() )
            timer2->start( 1000 );
    }
    void MainWindow::test2_cyclique() {
        static int n = 10;
        this->write( "test 2", "console" );
        if ( --n == 0 ) {
            n = 10;
            timer2->stop(); // terminer apres 10 messages
        }
    }

  6. #6
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Merci de ta réponse mais ça ne peut pas fonctionner car dans mon vrai code j'ai :


    // une instruction

    sleep(une durée définie);

    // une autre instruction

    sleep(une durée définie);

    // encore une instruction

    sleep(une durée définie);
    .
    .
    .
    .
    etc.

    Et je voudrais que pendant le temps des sleep je puisse continuer à exécuter d'autre choses.

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 586
    Points : 7 724
    Points
    7 724
    Par défaut
    Le sleep() ne rendant pas la main, il faut :
    * exécuter les traitements parallèles sur des threads avec les contraintes que cela impose.
    * on peut utiliser des timers 'one-shot' pour gérer le passage à l'étape suivante, en généralisant mon exemple dans une table
    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
    struct AFaire {
          void (MainWindow::*fct)();  // ptr sur ieme fct a appeler
          unsigned duree; // delai a effectuer ensuite
    };
    void MainWindow::fairePleinDeChoses() {
      static const QVector<AFaire> table = { { &fct1, 1000 } , { &fct2, 2000 }, {&fct3 , 0 } };
      AppelerFct( table , 0 );
    }
    void MainWindow::AppelerFct( const QVector<AFaire>& table , unsigned indice ) {
       (*table[indice].fct)(); // effectuer ieme traitement
       if ( ++indice < table.size() ) { // passer au suivant
          QTimer::singleShot( table[indice-1].duree , this , [=](){ AppelerFct(table,indice); } ); // delai puis appeler fct suivante
       }
    }
    void MainWindow::fct1() {
    }
    void MainWindow::fct2() {
    }

  8. #8
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Pour les thread je viens de voir ça et faut oublier car il y a des fonctions que j'utilise dans mes 2 boutons.

    Sinon, je pense que ta méthodes peut marcher mais ... C'EST HULTRA RELOU !!!!!!!!!!!!!!

    Attends, ... sauf si ... dans la fonction sleep() je ...

    Nan mais si, si je met tout mon code dans mon thread et que je garde juste le thread principale pour refresh l'affichage mais du coups il me faut aussi un thread spécifique à la base de donnée.
    Et merde, je dois tout refaire mon code.
    OK, je teste ça et je te dis ^^

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

Discussions similaires

  1. Exécution de deux fonctions simultanémment
    Par p1k1 dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/08/2013, 19h22
  2. [DI] Exécution de deux transformations en parallèle sur DIS
    Par dehasmae dans le forum Outils BI
    Réponses: 10
    Dernier message: 16/04/2012, 20h24
  3. exécution de deux fonctions simultanément.
    Par wulian dans le forum MATLAB
    Réponses: 9
    Dernier message: 05/08/2010, 14h13
  4. Réponses: 6
    Dernier message: 09/06/2009, 11h09
  5. Exécution de deux fonction avec ie
    Par musicann dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/06/2007, 15h25

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