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 confirm�
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    86
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    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
    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 : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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 confirm�
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    86
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    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