Bonjour,
je rencontre un problème pour afficher en temps réel les résultats de procédures de traitement réalisées dans des threads.
J'ai une classe CThreads dans laquelle sont définis 4 threads: 2 threads s'occupent de la lecture tandis que les 2 autres s'occupent du traitement des données lues. Dans les 2 threads de traitement, il y a une fonction PostMessage qui devrait appeler une fonction réalisant l'affichage en temps réel du résultat du traitement dans la fenêtre principale de l'application.
Voici un archétype de la classe CThreads:
La 2ème classe est une boite de dialogue:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 DWORD WINAPI CThreads::Lecture_Data0(LPVOID pvParam) { CThreads *pThisLD0=reinterpret_cast< CThreads *>( pvParam); DWORD dwEvt=0; DWORD dwBytesWritten=0; DWORD dwBytesRead=0; if(WaitForSingleObject(pThisLD0->hEventLD0[0],INFINITE)==WAIT_OBJECT_0 && WaitForSingleObject(pThisLD0->hEventLD0[1],INFINITE)==WAIT_OBJECT_0); // LECTURE SetEvent(pThisLD0->hEventLD1[1]); SetEvent(pThisLD0->hEventTD0); return 0; } DWORD WINAPI CThreads::Lecture_Data1(LPVOID pvParam) { CThreads *pThisLD1=reinterpret_cast< CThreads *>( pvParam); DWORD dwEvt=0; DWORD dwBytesWritten=0; DWORD dwBytesRead=0; if(!WaitForSingleObject(pThisLD1->hEventLD1[0],INFINITE) && !WaitForSingleObject(pThisLD1->hEventLD1[1],INFINITE)); // LECTURE SetEvent(pThisLD1->hEventLD0[1]); SetEvent(pThisLD1->hEventTD1); return 0; } DWORD WINAPI CThreads::Traitement_Data0(LPVOID pvParam) { CThreads *pThisTD0=reinterpret_cast< CThreads *>( pvParam); pThisTD0->SetCurrentThreadName("Traitement Data0"); // TRAITEMENT ::PostMessage(pThisTD0->fenetre,WM_FINCALCUL,0,0); SetEvent(pThisTD0->hEventLD0[0]); SetEvent(pThisTD0->hEventFin0); return 0; } DWORD WINAPI CThreads::Traitement_Data1(LPVOID pvParam) { CThreads *pThisTD1=reinterpret_cast< CThreads *>( pvParam); pThisTD1->SetCurrentThreadName("Traitement Data1"); //TRAITEMENT ::PostMessage(pThisTD1->fenetre,WM_FINCALCUL,0,0); SetEvent(pThisTD1->hEventLD1[0]); SetEvent(pThisTD1->hEventFin1); return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CTempsReelDlg) virtual BOOL OnInitDialog(); afx_msg void OnStart(); //}}AFX_MSG void OnReceiveFinCalcul(WPARAM wparam, LPARAM lparam); //Message privé DECLARE_MESSAGE_MAP()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 BEGIN_MESSAGE_MAP(CTempsReelDlg, CDialog) //{{AFX_MSG_MAP(CTempsReelDlg) ON_BN_CLICKED(IDC_Start, OnStart) ON_MESSAGE(WM_FINCALCUL,OnReceiveFinCalcul) // message privé //}}AFX_MSG_MAP END_MESSAGE_MAP()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void CTempsReelDlg::OnReceiveFinCalcul(WPARAM wparam, LPARAM lparam) { // AFFICHAGE }
Le problème que je rencontre est qu'au lieu que le résultat s'affiche chaque fois qu'un thread de traitement est terminé, seul le dernier résultat s'affiche au niveau de la boite de dialogue et ce lorsque tous les threads sont finis.
Il y a visiblement quelquechose qui m'échappe. Quelqu'un aurait-il une idée?
Merci d'avance.
P.S. je développe sous Embedded Visual C++
Partager