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

C++Builder Discussion :

Exécuter simultanément plusieurs fonctions [FAQ]


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut Exécuter simultanément plusieurs fonctions
    Bonjour,

    Je cherche à exécuter simultanément 2 fonctions.
    Pour simplifier le problème, voici un code qui correspond simplement à ce qui bloque :

    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
    // -----------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int s;
    bool fini = false;
     
    while(!fini)
    {
       Label1->Caption = String(s);
       Sleep(100);
       Application->ProcessMessages();
       s++;
    }
    }
     
    // -----------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    int s;
    bool fini = false;
     
    while(!fini)
    {
       Label2->Caption = String(s);
       Sleep(100);
       Application->ProcessMessages();
       s++;
    }
    }
    Dès que je clique sur le bouton1, 1er compteur se lance bien... Par contre, dès que je clique sur le bouton2, le 2ème compteur démarre et le 1er s'arrête.

    Y'a-til un moyen simple de résoudre ce problème ou faut-il nécessairement passer par les processus/mutithreads/sémaphores etc (que je ne maitrise pas spécialement)... ?

    Merci !

  2. #2
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Qu'est ce que tu veux faire exactement.

    tu as 2 fonctions qui font la même chose mais est ce que les compteurs sont différents ?

    Parce que tu pourrais peut-être utiliser des timer plutôt que des sleep.

  3. #3
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    L'entier s n'est pas initialisé et la variable booléenne fini ne bouge pas donc on est dans une boucle infinie.

    Sinon, vous pouvez n'écrire qu'une seule fonction de comptage et utiliser le Tag des boutons pour savoir si le compteur doit démarrer.

    Dans la classe principale, vous déclarez deux variables s1 et s2 et le prototype de la fonction qui compte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int s1,s2;
    void __fastcall Compte();
    Vous initialisez les variables dans le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    s1=0;
    s2=0;
    }
    Au clic des boutons vous comptez. Les deux boutons doivent se rediriger sur ce même événement (liste déroulante dans l'inspecteur d'objets)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TButton* B=(TButton*)Sender;
    B->Tag=1;
    Compte();
    }
    Et la fonction choisit les TLabel à mettre à jour :

    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
    void __fastcall TForm1::Compte()
    {
    bool fini = false;
     
    while(!fini)
       {
       if(Button1->Tag==1)
          {
          Label1->Caption = String(s1);
          Sleep(100);
          Application->ProcessMessages();
          s1++;
          }
       if(Button2->Tag==1)
          {
          Label2->Caption = String(s2);
          Sleep(100);
          Application->ProcessMessages();
          s2++;
          }
       }
    }
    Les threads ne sont pas difficiles à utiliser, ce serait quand même mieux.

    À bientôt
    Gilles

  4. #4
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    kurul1> Merci pour ces explications, mais les codes que j'ai présenté ici (comme expliqué dans mon 1er post ) n'étaient que des exemples. La boucle infinie était juste là pour montrer l'exécution de 2 fonctions à la fois.

    D'après ce que m'a dit Gilles Louïse, je pense que je vais utiliser des threads... Existe-t'il un tutoriel simple expliquant son utilisation de base (c'est à dire exécuter 2 fonctions simultanément) sous C++ Builder (avec les types à utiliser, qui fonctionnent sous n'importe quelle version de Windows, etc) ?

    Merci !!

  5. #5
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Si ca peux t'aider, voila le tutoriel sur les Threads

  6. #6
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Merci beaucoup, j'aurais pu chercher davantage ...
    J'essaie de voir ce que je peux faire avec cela !

Discussions similaires

  1. Exécution de plusieurs fonctions
    Par July171292 dans le forum Ext JS / Sencha
    Réponses: 2
    Dernier message: 09/04/2015, 15h51
  2. Exécuter plusieurs fonctions en même temps
    Par vash641 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/05/2009, 15h50
  3. Réponses: 3
    Dernier message: 09/04/2009, 10h14
  4. Plusieurs fonctions qui s'exécutent au même temps
    Par saidus dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 07/07/2008, 03h42
  5. Comment attendre l'exécution de plusieurs fonctions ?
    Par MilouTux dans le forum MATLAB
    Réponses: 9
    Dernier message: 31/05/2007, 09h46

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