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