Bonjour,
J'ai une question sur le fonctionnement de la fonction décrite PumpMessages décrites dans la F.A.Q.
fonction PumpMessages:
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 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 } }
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
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")); }
Voyez -vous où est la subtilité?
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); }
Merci d'avance
Partager