Bonjour,

J'ai un problème dans une application multi-thread, je vais tenté de simplifier au maximum car j'ai beaucoup de code.

Donc dans une CDialog, j'exécute 3 threads, qui ont chacun un lien avec la CDialog.

A la fin de ces Threads j'envoie des messages privés pour exécuter des fonctions d'affichage et de traitements divers (calculs).

Ces messages privés doivent être exécutés dans l'ordre c'est pourquoi je les ai synchronisé avec des évènements (CEvent)

Mais lorsque que j'exécute mon appli, tout semble figé et ça dure indéfiniment.

Mieux que des explications : du code -->
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
68
69
70
71
72
CDlg::CDlg()
{
	m_hAffichageEvent = CreateEvent(0, FALSE, FALSE, 0);
	m_hCalculEvent = CreateEvent(0, FALSE, FALSE, 0);
	m_hEnregistrementEvent = CreateEvent(0, FALSE, FALSE, 0);
}
 
BEGIN_MESSAGE_MAP(CDlg, CDialog)
	//{{AFX_MSG_MAP(CDlg)
	ON_WM_CTLCOLOR()
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_BTN_LANCER_ACQ, OnBtnLancerAcq)
	//}}AFX_MSG_MAP
	ON_MESSAGE( WM_TRAITEMENT,		OnTraitement) // Message privé
	ON_MESSAGE( WM_CALCUL,			OnCalculer) // Message privé
	ON_MESSAGE( WM_AFFICHAGE,		OnAfficher) // Message privé
	ON_MESSAGE( WM_ENREGISTREMENT,	OnEnregistrer) // Message privé
END_MESSAGE_MAP()
 
void CDlg::OnBtnLancerAcq() 
{
	AfxBeginThread(ThreadAcquisition, this);
	AfxBeginThread(ThreadArret, this);
}
 
void CDlg::OnEnregistrer(WPARAM wparam,LPARAM lparam)
{
	::SetEvent(m_hEnregistrementEvent);
}
 
void CDlg::OnAfficher(WPARAM wparam,LPARAM lparam)
{
	::SetEvent(m_hAffichageEvent);
}
 
void CDlg::OnCalculer(WPARAM wparam,LPARAM lparam)
{
	::SetEvent(m_hCalculEvent);
}	
 
void CDlg::OnTraitement(WPARAM wparam, LPARAM lparam)
{
	::PostMessage(this->m_hWnd, WM_CALCUL, 0, 0);
 
	::WaitForSingleObject(m_hCalculEvent, INFINITE);
 
	::PostMessage(this->m_hWnd, WM_AFFICHAGE, 0, 0);
 
	::WaitForSingleObject(m_hAfficherEvent, INFINITE);
 
	::PostMessage(this->m_hWnd, WM_ENREGISTREMENT, 0, 0);
 
	::WaitForSingleObject(m_hEnregistrementEvent, INFINITE);
 
	::CloseHandle(m_hCalculEvent);
	::CloseHandle(m_hAffichageEvent);
	::CloseHandle(m_hEnregistrementEvent);
}
 
UINT CDlg::ThreadAcquisition(LPVOID pvParam)
{
	CDlg  *pThis=reinterpret_cast< CDlg *>( pvParam) ;
	srand(GetTickCount());
 
	/* Du code*/
 
	::PostMessage(pThis->m_hWnd, WM_TRAITEMENT, 0, 0);
 
	/* Du code*/
 
	return TRUE;
}
En mode Debug, ça bloque dès le premier WaitForSingleObject et ça n'en bouge plus, les messages privés ne sont même pas exécutés ... Je ne vois pas pourquoi, d'où ma requête.

Merci pour votre aide, précieuse