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 :

Forcer l'execution d'une fonction dans un thread


Sujet :

Threads & Processus C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Points : 81
    Points
    81
    Par défaut Forcer l'execution d'une fonction dans un thread
    Bonjour,

    je fais mon premier programme utilisant le multi-threading sous windows.
    J'ai un thread principal et un thread secondaire créé avec CreateThread() qui tourne en permanence avec une boucle while().

    J'ai besoin de faire en sorte que mon thread principale appelle une fonction d'une classe instancié dans le thread secondaire (qui modifie des états de cette classe).
    Je peux utiliser pour cela la fonction PostThreadMessage() et faire executer la fonction désirée par le second thread à la réception du message.
    Mais mon problème, c'est que mon thread principal a besoin d'être certain que la fonction du thread secondaire a bien été executé avant dans continuer son exécution (il doit attendre).

    La seul solution que j'ai trouvé c'est quelque chose comme ci-dessous. Mais j'ai pas l'impression que ce soit la meilleur (surtout à cause du while de FonctionThreadPrincipal() si aucun message de retour n'est capté)

    Dans mon thread principal:
    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
     
    void FonctionThreadPrincipal(int variable1, int variable2)
    {
        UINT   msgSend = MESSAGE_PERSO;
        FONCTIONDESC* desc = new FONCTIONDESC();
        desc->variable1    = variable1;
        desc->variable2    = variable2;
     
        WPARAM wParamSend = (WPARAM)desc;
        LPARAM lParamSend = (LPARAM)0;
     PostThreadMessage(m_ThreadSecondaireId,msgSend,wParamSend,lParamSend);
     
        // on attend
        MSG msgFeedBak;
        while(PeekMessage(&msgFeedBak,NULL,MESSAGE_PERSO,MESSAGE_PERSO,PM_REMOVE) == FALSE)
        {
            ; // on fait rien
        }
        // Ok on peut continuer.
    }
    Dans mon thread secondaire:

    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
     
    while( runProcess )
    {
        if( PeekMessage(&msg,NULL,MESSAGE_PERSO,MESSAGE_PERSO,PM_REMOVE) == TRUE )
            {
                switch(msg.message)
                {
                case MESSAGE_PERSO:
                    FONCTIONDESC* desc = (FONCTIONDESC*)msg.lParam;
                    m_MonInstance->MaFonction( desc->variable1    ,desc->variable2);
                    delete desc;
     
                    // feedback
                    UINT   msgSend        = MESSAGE_PERSO;
                    WPARAM wParamSend    = 0;
                    LPARAM lParamSend    = 0;
                    PostThreadMessage(m_CallerThreadId,msgSend,wParamSend,lParamSend);
                    break;
                };
            }
     
      update();
    }
    Qu'est ce que je dois faire ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Avec l'API Win32, à priori, je regarderais du côté d'un Event et des fonctions d'attentes.

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Event ou sémaphore, en effet, c'est la meilleure solution pour la question posée.

    Toutefois, il se pose une autre question, tacite : à quoi te sert d'avoir du MT si tu dois bloquer le thread PRINCIPAL pendant que le thread SECONDAIRE bosse ?? C'est un défaut de conception... Au mieux, tu vas bloquer les messages de l'application (effet "fenêtre gelée"), et si jamais ton thread secondaire se plante, t'es bon pour tuer le processus à la main.

    J'envisagerais plutôt l'exécution d'une callback pour ma part, ou l'exécution directe depuis le thread principal, mais sûrement pas de bloquer le thread principal en attente du thread secondaire en tout cas...

    EDIT : La callback peut être faite soit par appel direct d'une fonction, bien sûr, mais aussi en postant un message vers le thread principal.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Points : 81
    Points
    81
    Par défaut
    Je vais faire un peu comme je pensais. J'en ai juste besoin pour certaines rares actions.
    Merci.

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

Discussions similaires

  1. Executer une fonction dans une autre base de donnees
    Par yonnel dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/10/2007, 01h31
  2. Forcer la fin de l'execution d'une fonction
    Par Valkirion dans le forum C++
    Réponses: 7
    Dernier message: 10/08/2007, 14h32
  3. Exécuter une fonction dans un thread
    Par Silverstone dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 23/06/2007, 12h24
  4. Executer une fonction dans un module pas encore importe
    Par Aragorn_destroy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/06/2007, 14h21
  5. executer une fonction dans un regexp
    Par mobscene dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2007, 22h44

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