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

Threads & Processus C++ Discussion :

Executer une fonction (avec paramètres) dans un thread secondaire


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut Executer une fonction (avec paramètres) dans un thread secondaire
    Bonjour à tous,

    Je travaille sur une application très complexe. Et j'envisage, pour rendre l'application plus disponible, créer un thread qui me permet d'exécuter une fonction qui a plusieurs paramètres dans un thread secondaire. J'ai commence à regarder comment créer un thread, et j'en ai trouvé plusieurs. Le problème c'est que je suis débutant dans ce domaine et j'ai besoin d'aide.

    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
    int main()
    {
    //plusieurs instructions et appel de fonctions
     
    fonction (a, b, c)
     
    ///////////
    //à ce niveau je veux remplacer la fonction par le lancement d'un thread qui permet d'exécuter la fonction 
    ///////////
     
    }
     
    void fonction (int a, bool b, int c)
    {
    a= 2; 
    c=a+2
    if (c = 4)
    printf(" test ")
    }
    Merci pour vos réponses

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Bonjour.

    Tu as effectivement différentes solutions qui dépendent beaucoups de ce que tu veux faire.

    Pour cela, il faudrait savoir:
    • ta fonction est elle appelée dans une boucle type boucle for ? (si oui, OpenMp est peut être la meilleure solution).
    • Les paramètres de ta fonction sont -ils toujours les même (apres le début du lancement du thread) ou peuvent-ils varier au cours du thread? (s'ils peuvent varier, tu va avoir besoin de mutexes-> Boost thread ou appels systèmes ou autre, (je les connais pas toutes ).Note que si ce sont plusieurs appels de fonction, ce n'est absolument pas nécessaire(il suffit d'avoir un thread par appel)...a moins qu'il y ait des passage par référence).
    • Ta fonction manipule-elle des variables externes (idem, mutexes).
    • Ton application est-elle destinée à être multi-plateforme ?
    • sinon, sur quel système d'exploitation es-tu ?



    Bonne chance

  3. #3
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    Merci bcp pour ta réponse.
    • Ma fonction n'est pas appelé en boucle.
    • Les paramètres de ma fonction sont tjs les mêmes
    • Ma fonction ne manipule pas des variables externes
    • Ma fonction n'est pas destinée à être multi-plateforme
    • Mon application tourne sur un système d'exploitation windows et le développement est sous Visual Studio C++ 6.0


    Avant de poster ce sujet, j'ai regardé un peu sur le net. Et j'ai commencé par utiliser _beginthread. Le problème c'est qu'elle permet de lancer une fonction sans paramètres. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    main()
    {
    int n = 5;
    _beginthread(MaFonction,0,(void*)n);
    }
     
    void MaFonction(void*)
    {
     printf("Le nombre : %d",id);
     _endthread();
    }
    Mais avec une fonction avec 2 ou 3 paramètre différents je ne sais pas comment faire.

    Je m'excuse d'avance si j'ai du mal à m'exprimer et expliquer mon problème. C'est parce que je ne suis pas un expert dans ce domaine.

    Merci à tous

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    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
    struct funcParams
    {int a; bool b; int c;
    };
     
    fonction (a, b, c);
     
    main()
    {
      funcParams params;
      params.a = 1;
      params.b = true;
      params.c = 42;
    _beginthread(MaFonction,0,&params);
    }
     
    void MaFonction(void* p)
    {
      funcParams *params = static_cast<funcParams>(p);
      f(params->a, params->b, params->c);
    }
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    Merci méphistopheles. Affirmatif, VC6 est imposé

    Merci pour message JolyLoic, et j'ai bien pris connaissance de la notification que tu ma envoyé. Je tiens à m'excuser car je suis un nouveau sur le forum

    J'ai procèdé comme tu viens de le préciser et j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2664: '_beginthread' : cannot convert parameter 1 from 'void (void *)' to 'void (__cdecl *)(void *)'
    As-tu une idée d'où ça peut venir ?

    Merci

  6. #6
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par you38 Voir le message
    Merci méphistopheles. Affirmatif, VC6 est imposé

    Merci pour message JolyLoic, et j'ai bien pris connaissance de la notification que tu ma envoyé. Je tiens à m'excuser car je suis un nouveau sur le forum

    J'ai procèdé comme tu viens de le préciser et j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2664: '_beginthread' : cannot convert parameter 1 from 'void (void *)' to 'void (__cdecl *)(void *)'
    As-tu une idée d'où ça peut venir ?

    Merci
    J'ai l'impression qu'il y a confusion avec un pointeur de fonction. faudra que je reregarde la syntaxe du cast (pas le temps là, je fairais un édit ou un autre post). est-ce que ça fait la même chose avec le code de joly_loic ?

    Bonne chance

  7. #7
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par you38 Voir le message
    Merci bcp pour ta réponse.
    • Ma fonction n'est pas appelé en boucle.
    • Les paramètres de ma fonction sont tjs les mêmes
    • Ma fonction ne manipule pas des variables externes
    • Ma fonction n'est pas destinée à être multi-plateforme
    • Mon application tourne sur un système d'exploitation windows et le développement est sous Visual Studio C++ 6.0
    En gros, un simple fork suffirait. Par contre, pas de chance de devoir encore être sur VC6.0. C'est imposé par ton patron ?

    Citation Envoyé par you38 Voir le message
    Avant de poster ce sujet, j'ai regardé un peu sur le net. Et j'ai commencé par utiliser _beginthread. Le problème c'est qu'elle permet de lancer une fonction sans paramètres.
    [...]

    Mais avec une fonction avec 2 ou 3 paramètre différents je ne sais pas comment faire.
    Attention à ne pas confondre void* et void: En effet, alors que void est littéralement rien, void* est un pointeur sur rien autrement dit, un pointeur sans type soit un pointeur sur n'importe-quoi en fait (donc potentiellement sur tout, oui, je sais, c'est tordu ).
    Tu transmet donc bien un paramètre à ta fonction. il te suffit de le recaster après pour obtenir ce que tu veux par exemple dans ton cas:

    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
    struct mestroisParamètres
    {
       int Param1;
       bool Param2;
       int Param3;
    };
    main()
    {
       mestroisParamètres mtP = {4,true,54};
       _beginthread(MaFonction,0,(void*)mtP ;
       //Atttention a ne pas modifier mtP avant la fin du thread !
    }
     
    void MaFonction(void* mesParametres)
    {
      if(((mestroisParamètres*)mesParametres)->Param2)
         printf("Le Param1 est : %d Le Param2 est Vrai, Le Param3 est %d",
             &((mestroisParamètres*)mesParametres)->Param1,
             &((mestroisParamètres*)mesParametres)->Param3);
      else
          printf("Le Param1 est : %d Le Param2 est Faux, Le Param3 est %d",
             &((mestroisParamètres*)mesParametres)->Param1,
             &((mestroisParamètres*)mesParametres)->Param3);
       _endthread();
    }
    Normalement, il serait plus à propos d'utiliser cin et cout, mais vu que Vc++6.0 ne respecte pas la norme et est à peine du c++, mieux vaut rester C-style.(par contre, j'ai écris ça à la volée, je ne me rappelle plus si le printf prend des pointeurs ou des valeurs en paramètres donc, à corriger en cas de besoin.)

    Citation Envoyé par you38 Voir le message
    Je m'excuse d'avance si j'ai du mal à m'exprimer et expliquer mon problème. C'est parce que je ne suis pas un expert dans ce domaine.

    Merci à tous
    Au contraire, c'est plutot clair

    Bonne chance pour la suite

    EDIT: arf, grilled par joly_loic. Par contre, tu es sûr que le static_cast est disponible sur VC++6.0 ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2012, 14h18
  2. Executer une application avec paramètres
    Par GUNNM45 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/09/2008, 09h54
  3. appeler une méthode avec paramètre dans une page JSP
    Par javasmif dans le forum Struts 2
    Réponses: 1
    Dernier message: 06/12/2007, 10h48
  4. Réponses: 18
    Dernier message: 27/10/2006, 14h15
  5. Peut-on executer une fonction qui est dans un iframe ??
    Par miloud dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 19/04/2006, 11h52

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