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 :

Fonctionnement de PumpMessages


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 21
    Par défaut Fonctionnement de PumpMessages
    Bonjour,

    J'ai une question sur le fonctionnement de la fonction décrite PumpMessages décrites dans la F.A.Q.

    fonction PumpMessages:

    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
     
    void CTempsReelDlg ::PumpMessages() 
    { 
       // Handle dialog messages 
        MSG msg; 
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
        { 
            if (!AfxGetApp()->PreTranslateMessage(&msg)) 
    		{ 
             ::TranslateMessage(&msg); 
             ::DispatchMessage(&msg); 
    		}
        AfxGetApp()->OnIdle(0);   // updates user interface 
        AfxGetApp()->OnIdle(1);   // frees temporary objects 
        } 
    }
    J'ai un thread dans une classe Dlg, dans celui-ci il y a un appel à la fonction PostMessage. Lorsque je fais appel à la fonction PumpMessages dans le thread, le message n'est pas reçu immédiatement (il faut attendre que d'autres threads de travail qui tournent en même temps soient finis) :

    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
     
    DWORD WINAPI CTempsReelDlg::PompeMsg(LPVOID pvParam)
    {
    	CTempsReelDlg  *pThis=reinterpret_cast< CTempsReelDlg *>( pvParam);
     
    	::PostMessage(pThis->hWnd,WM_FINCALCUL,0,0);
    	pThis->PumpMessages();
    	return 0;
    }
     
    void CTempsReelDlg::OnStart() 
    {
    	hWnd = GetSafeHwnd();
    	HANDLE hThread;
    	hThread=CreateThread(NULL,0,PompeMsg,this,0,NULL);
    	// PumpMessages();
    	CloseHandle(hThread);
    }
     
    void CTempsReelDlg::OnReceiveFinCalcul(WPARAM wparam, LPARAM lparam)
    {
    	m_cListe.AddString(_T("essai"));
    }
    Alors que lorsque je fais appel à la fonction PumpMessages en dehors du thread, le message est bien reçu immédiatement (pendant le fonctionnement des autres threads de travail):

    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 CTempsReelDlg::PompeMsg(LPVOID pvParam)
    {
    	CTempsReelDlg  *pThis=reinterpret_cast< CTempsReelDlg *>( pvParam);
     
    	::PostMessage(pThis->hWnd,WM_FINCALCUL,0,0);
    	// pThis->PumpMessages();
    	return 0;
    }
     
    void CTempsReelDlg::OnStart() 
    {
    	hWnd = GetSafeHwnd();
    	HANDLE hThread;
    	hThread=CreateThread(NULL,0,PompeMsg,this,0,NULL);
    	PumpMessages();
    	CloseHandle(hThread);
    }
    Voyez -vous où est la subtilité?


    Merci d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    la pompe a message concerne le thread principal.
    elle s'occupe de relayer les messages a toutes les interfaces de l'application.
    et je le redis : pas de gui dans les threads de travail.
    voir faq:
    http://c.developpez.com/faq/vc/?page...d#WorkerThread

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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