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

Windows Discussion :

[WinAPI C++] MultiThreading et PostMessage


Sujet :

Windows

  1. #1
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut [WinAPI C++] MultiThreading et PostMessage
    [edit : le vrai probleme est expliqué dans mon 2eme message.
    Merci de votre comprehension]

    Salut, je cherchais simplement a changer le texte d'un Label mais pour des raisons que j'ennoncerai ptet plus tard, j'ai pas voulu utiliser SetDlgItemText ou SendMessage, mais plutot PostMessage avec WM_SETTEXT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage (hMonLabel, WM_SETTEXT, 0, (LPARAM)"Coucou");
    où hMonLabel est un HWND renvoyé par GetDlgItem.

    Et bein ca marche pas :
    - le label est inchangé
    - PostMessage renvoie 0

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    La doc dit :
    If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters cannot include pointers. Otherwise, the operation will fail. The functions will return before the receiving thread has had a chance to process the message and the sender will free the memory before it is used.
    Cela dit, je comprends pas trop le probleme dans ton cas.

  3. #3
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Ah oki
    Et comment savoir qu'un message est "en dessous de" WM_USER ?

    Bon en fait, mon vrai probleme, c encore un pb de multi-threading..
    Le thread que je crée met a jour des Labels dans ma fenetre (et aussi une progressbar) et.. je veux que qd je clique sur le bouton Stop, ca stoppe le thread.
    Pour ca g utilisé une variable globale qui est testée dans la boucle de mon thread et que je positionne a une certaine valeur, dans la procedure de gestion de fenetre, dès interception du click sur "Stop".

    Cependant, pour pas qu'il yait de probleme, j'ai voulu "synchroniser" l'arret du thread, et ca par l'appel de WaitForSingleObject().
    Le pb, c que j'ai du placer cette instruction, a l'interieur de la procedure de la fenetre, juste apres l'affectation de ma variable globale d'arret. ca bloque la procedure de la fenetre (donc le thread principal) au niveau de cette instruction d'attente...
    La où je comprenais pas, c que mon thread ne s'arretait jamais.. (où uniquement par timeout).

    Apres reflexion, j'ai conclu que ca pouvait etre les SetDlgItemText() se trouvant dans la boucle de mon thread qui mettaient le binz.
    CAR, les SetDlgItemText() sont vraissemblablement equivalents à des SendMessage() de WM_SETTEXT, et SendMessage attend que le message soit bien intercepté pour retourner.
    OR, ma procedure de gestion des messages est bloquée par le WaitForSingleObject.......
    J'ai lu que PostMessage() n'attendait pas que le message soit intercepté pour retourner donc j'ai voulu essayer ca. Mais ca marche pas.

    Ainsi, que dois je faire :
    Au pire je peux toujours "killer" le thread avec TerminateThread(), mais dans le tuto c expliqué que c un peu chacal de faire ca. Ou bien ne pas du tout attendre la fin du thread..

    Merci pour votre patience.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 89
    Points : 90
    Points
    90
    Par défaut
    Salutation,
    as tu mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define UM_TOTO           (WM_APP + 123)
    par exemple?
    Cordialement
    Walm

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Salut,

    Non, j'avais pas créé de Message Perso...



    Bon finalement j'ai trouvé une solution : tester systematiquement ma variable globale d'état avant d'appeller tout SendMessage... Comme ca ya pas de bloquage, qd on appuye sur stop.

    Merci.

  6. #6
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Hm, j'ai trouvé une autre solution.. un peu plus propre.

    J'ai créé ce message perso :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define UM_CAN_BE_ENDED WM_USER + 33
    .. qui en fait sera envoyé a la fenetre par le thread créé pour indiquer qu'il compte plus envoyer de Messages (on pourra donc appeller WaitForSingleObject() en toute tranquilité).

    G cette variable globale qui permettra de stopper le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum ThState {STOP, RUNNING, STOPPING} etat;
    Positionnée à STOP au debut du programme
    Positionnée à RUNNING juste avant l'appel de CreateThread
    Positionnée à STOPPING des interception du click sur le bouton Stop (par exemple)
    Repositionnée à STOP apres le WaitForSingleObject()

    Dans la fonction de mon thread, j'aurais un code genre :
    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
    DWORD WINAPI threadProc (LPVOID lpParam)
    {
    	//...
    	//...
    
    	while (/*condition(s) && */ etat == RUNNING)
    	{
    		//Traitement
    		//... avec ventuellement des SendMessage
    		//...
    	}
    
    	//Envoi du message perso à la fenetre principale pour dire qu'elle peut s'attendre à la fin du thread.
    	PostMessage (hDlg, UM_CAN_BE_ENDED, 0, 0);
    
    	//.. instructions finales (mais pas de SendMessage!)
    	return 0;
    }
    Et dans le swith (message) de ma fonction de fenetre j'aurais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case UM_CAN_BE_ENDED :
    	WaitForSingleObject(hThread, 2000);
    	etat = STOP;
    	//autres instructions
    	return TRUE;

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    As-tu pensé à une boucle PeekMessage à la place d'une boucle GetMessage. Si chaque itération de ta boucle while(condition) est courte (qq dizaines voire centième de secondes max), ça peut être bien, plus besoin de thread :
    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
    while ( TRUE )
    {
        // s'il y a un message
        if ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE) )
        {
            // le traiter
            if ( GetMessage( &msg, NULL, 0, 0 ) )
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            else
            {
                // WM_QUIT
                break;
            }
        }
        else
        {
            // sinon effectuer le traitement
            Traitement();
        }
    }

  8. #8
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Ouais, j'éssairai la prochaine fois ,)

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

Discussions similaires

  1. [MFC] PostMessage, multithread
    Par Joeleclems dans le forum MFC
    Réponses: 6
    Dernier message: 24/05/2005, 16h17
  2. [WinAPI C++] MultiThreading?
    Par Gruik dans le forum Windows
    Réponses: 2
    Dernier message: 25/03/2004, 00h08
  3. [MFC] Ctrl/Alt+touches avec PostMessage
    Par Fladnag dans le forum MFC
    Réponses: 4
    Dernier message: 10/02/2004, 14h33
  4. [Win32]App multithread
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 25/09/2003, 09h57
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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