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

MFC Discussion :

Communication entre des threads


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut Communication entre des threads
    Bonjour à tous,
    Je suis entrain de développer un logiciel sous Visual Studio en C++ à base de fenêtres Dialog.
    Je souhaite communiquer entre une fenêtre et un processus lancer à partir de celle-ci.
    Je lance le processus de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CRuntimeClass* m_pThread = RUNTIME_CLASS(TagDetectThread);
    AfxBeginThread(m_pThread,THREAD_PRIORITY_NORMAL,0,0,NULL);
    TagDetectThread étant la classe qui contient le processus.
    Je comptais utiliser les fonctions suivantes mais je n'arrive pas a les faire fonctionner :
    PostThreadMessage
    RegisterWindowMessage
    ON_REGISTERED_THREAD_MESSAGE


    A la suite d'un "click" sur un bouton, je veux déclencher la fin du thread.
    J'utilise donc la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DWORD ID;
    ID = (ULONG)GetCurrentThreadId;
    PostThreadMessage(ID,WM_QUIT,0,0);
    Dans la classe comportant mon thread, j'ajoute juste après la boite de message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [i]ON_THREAD_MESSAGE(WM_QUIT,Run)       // Run étant la fonction du thread
    Dans cette fonction Run, je met une fonction de détection de cette forme :
    MSG msg;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(GetMessage(&msg,NULL,0,0)<0) AfxMessageBox("Error");
    Malheureusement elle ne fonctionne pas. Etant donné que je débute en MFC - C++, je ne comprends pas pourquoi celà ne marche pas ?
    Ais-je oublié quelque chose ? Y a-t-il quelque chose de mal défini ?
    Merci beaucoup pour votre aide.

    utilise la balise code, Merci Farscape

  2. #2
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    Salut,

    supposition (1):
    Tu dis que tu "lance le processus", donc ce doit être un exécutable.
    Ce que tu peux faire:
    Tu déclare une variable membre qui sera le handle de ton processus lancé avec ( supposition tjrs ) CreateProcessus( ) lors d'un clic sur un bouton de commande par exemple.
    Lorsque tu voudras le manipuler avec les autres fonction de l'API, tu pourras tjrs te servir du handle du processus.

    supposition (2):
    Tu parles aussi de Thread, donc là on est "plus" ds une fonction.
    Pareil que ci-dessus, mais avec CreateThread( ).

    Si tu as la MSDN, faire un F1 sur CreateProcessus et CreateThread qui t'expliquera les autres fonctions de manipulation des processus/thread.

    C'est pas du pur MFC ( plutôt de l'API Win32 ) mais ça peut te sortir d'affaire.


  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Déjà, ton thread est-il un vrai thread UI, avec boucle de messages et tout, ou bien un thread qui fait un traitement et qui n'est pas supposé avoir de boucle de messages ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    Je ne vois pas trop ce que tu entends par Thread UI, mais en gros la classe TagDetectThread est dérivée d'une classe CWinThread, et elle comporte une partie réception des messages (avec AFX) et une instance RUN dans laquelle j'ai mis le code a executer par le thread.
    Concernant la fonction de ce thread, il doit juste se terminer quand on lui demande et s'intérompre sur demande. Après je en sais pas si celà nécéssite forcément une boucle de message.


    Pour Denn's, je suis dans la supposition (2) et je n'ai pas de problème pour lancer le thread. Je cherche a savoir comment lui faire prendre en compte un message qui vient d'une classe CDialog.
    Le problème n'est pas de savoir quelles sont les fonctions dont j'ai besoin, mais plutôt comment les faires fonctionnées ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ce que tu me décris, c'est un thread UI.

    C'est donc le genre de thread que tu peux terminer avec un PostThreadMessage(WM_QUIT, etc.) ou avec un message "registered" dans le traitement duquel tu appellerais PostQuitMessage().

    Généralement, je laisse l'EDI généré automatiquement les handlers pour les messages enregistrés pour les fenêtres, mais j'ignore si ça marche pour les CWinThread aussi (et j'en doute...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    Effectivement ca marche bien pour les fenêtres mais pour les threads je ne crois pas que ça soit possible. Ca va être dur d'avancer dans ces conditions ...

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/01/2008, 13h17
  2. variables partagées entre des threads
    Par Aragorc dans le forum Delphi
    Réponses: 27
    Dernier message: 06/10/2006, 15h12
  3. Communication entre 2 thread
    Par poxigua dans le forum GTK+
    Réponses: 3
    Dernier message: 08/08/2006, 16h59
  4. Communication entre 2 threads
    Par marsupilami34 dans le forum Langage
    Réponses: 4
    Dernier message: 26/08/2005, 15h08
  5. Communication entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 13
    Dernier message: 28/01/2005, 09h14

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