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

Visual C++ Discussion :

Messages entre threads


Sujet :

Visual C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Messages entre threads
    Bonjour,

    J'ai une application composée d'une IHM sur laquelle il y a 2 bouton. Un pour lancer un thread et un autre pour l'arrêter. Lorsque je lance mon thread (CreateThread() ou _beginthread()) avec la fonction qu'il doit exécuter passée en paramètre, j'appelle une fonction addition pour faire des tests, cela marche sans problèmes.
    Maintenant, il serai intéressant pour moi que le thread qui fait l'addition puisse prévenir mon application principale lorsqu'il a fini son traitement. J'essaye d'utiliser les fonctions PostThreadMessage(), PostMessage(), mais rien à faire, je n'y arrive pas.

    Voilà ma fonction addition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DWORD WINAPI addition(LPVOID lpParam)
    {
    int a,b;
    DWORD parametre;
    a=9;
    b=5;
    c=a+b;
    parametre = *((DWORD*)lpParam);
    PostThreadMessage(parametre,WM_USER,0,0)
    return c;
    }
    et voilà les 2 erreurs que j'ai :

    Error 1 error LNK2028: unresolved token (0A00000E) "extern "C" int __stdcall PostThreadMessageW(unsigned long,unsigned int,unsigned int,long)" (?PostThreadMessageW@@$$J216YGHKIIJ@Z) referenced in function "unsigned long __stdcall `anonymous namespace'::addition(void *)" (?addition@?A0x77e23028@@$$FYGKPAX@Z) test_thread1.obj


    Error 2 error LNK2019: unresolved external symbol "extern "C" int __stdcall PostThreadMessageW(unsigned long,unsigned int,unsigned int,long)" (?PostThreadMessageW@@$$J216YGHKIIJ@Z) referenced in function "unsigned long __stdcall `anonymous namespace'::addition(void *)" (?addition@?A0x77e23028@@$$FYGKPAX@Z) test_thread1.obj


    Autre chose, je ne voudrai pas que mon application principale se bloque dans l'attente du message de la fonction addition().

    Merci de votre aide.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    1. N'utilise JAMAIS _beginthread(). C'est _beginthreadex() qu'il faut utiliser.
    2. PostThreadMessage() etc. sont dans user32.dll, il faut donc lier avec user32.lib. Et comme par hasard, c'est marqué dans l'aide.
    3. Si c'est une application avec IHM, tu gardes ta fenêtre affichée et tu postes le message à la fenêtre (Avec PostMessage(), donc) quand tu as fini...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    C'est bon, j'ai _beginthreadex() qui marche maintenant, mais j'aimerai bien savoir la différence entre les 2.
    Pour PostThreadMessage(), j'ai juste à inclure windows.h, et c'est déjà fait.
    Sinon avec la fonction PostMessage(), il me faut le HWND de la fenêtre principale (l'IHM, celle qui à lancée le thread), mais je ne sais pas comment le récupérer.

    Merci.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    La différence entre _beginthread() et _beginthreadex() est clairement expliquée dans l'aide:
    • _beginthread(), c'est du bricolage: Elle retourne l'ID du thread créé et non un handle, résultat: aucune sécurité.
    • _beginthreadex() est la fonction qui colle le plus à CreateThread() : Sa valeur de retour est bien un handle vers le thread, assuré d'être valide jusqu'à ce qu'on le ferme avec CloseHandle().
      _beginthreadex() est la surcouche parfaite de CreateThread() : elle fait la même chose que CreateThread(), avec en plus les initialisations dont la C Run-time library a besoin.


    Quant au HWND de la fenêtre principale, je vois deux cas:
    1. Si le thread principal a lancé le second thread AVANT de créer la fenêtre, je ne vois pas directement comment récupérer son handle: Il va falloir faire un truc compliqué.
    2. Si la fenêtre est déjà créée au lancement du nouveau thread, il suffit de passer son HWND dans les paramètres du thread (le fameux void*).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    J'arrive à récupérer le handle avec : fenetre = this->Handle; et à le passer en paramètre de mon thread (le void*), mais je n'arrive pas à le récupérer dans mon thread que je viens de lancer.
    Pour le récupérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HWND handle;
    handle = *((HWND*)lpParam);

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Tu peux me montrer comment tu crées ton thread ?
    Si tu ne passes pas l'adresse du HWND mais le HWND lui-même (et c'est ce que je conseillerais), il te suffit de retirer les étoiles et ça devrait marcher.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    récupération du handle et création du thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IntPtr handle_fenetre;
     
    handle_fenetre = this->Handle;
    _beginthreadex(nullptr,0,addition,&handle_fenetre,0,nullptr);
    et si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _beginthreadex(nullptr,0,addition,this->Handle,0,nullptr);
    j'obtiens qu'il ne peux pas convertir l'argument :
    Error 1 error C2665: '_beginthreadex' : none of the 2 overloads could convert all the argument types d:\visual c++ 2005\projets\test_thread1\test_thread1\Form1.h 180

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    utilise un toPointeur sur ton intptr et caste le en HWND, ca passera mieux

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Attends,
    Tu es en .Net ?!


    PS: Ton code ne pouvait pas marcher, tu passais à un autre thread l'adresse d'une variable locale...

    Edit: Ce n'était pas un gros titre, mais une expression de surprise...

  10. #10
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pas trop de gros titres


    Mais c'est clair que si tu fais uniquement du .net, il faudrait voir à utiliser les Threads de .net

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Je cré un projet CLR > Windows Form Application , et c'est du MFC .Net, mais je ne sais pas trop ce qu'est le .NET

    désolé de l'ignorance.

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    si tu as un projet CLR par défaut, tu n'as pas le support des MFC
    mais bon, je ne vois pas de mfc dans tout ca
    Nonobstant ca, tu devrais te tourner vers les threads .Net
    un début dans la faq : http://dotnet.developpez.com/faq/cpp...Multithreading
    sinon, en général
    http://dotnet.developpez.com/cours/

Discussions similaires

  1. Echange de messages entre 2 threads
    Par VinceCBA dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 20/08/2012, 15h18
  2. Comment attendre la fin de Message entre thread
    Par grunk dans le forum Android
    Réponses: 5
    Dernier message: 11/07/2011, 17h01
  3. [Reseaux] Pb envoi message entre 2 PC du même réseau
    Par Feanorin dans le forum Administration
    Réponses: 8
    Dernier message: 23/11/2005, 10h01
  4. Envoi de message entre 2 applications
    Par floweez dans le forum Windows
    Réponses: 9
    Dernier message: 30/06/2004, 16h34
  5. message entre dialog box et thread
    Par scorbo dans le forum MFC
    Réponses: 7
    Dernier message: 19/06/2004, 11h01

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