Bonjour,

après quelques heures de lecture de la FAQ et des multiples sujets lancés sur l'arret des thread j'ai compris qu'il fallait utiliser un WaitForSingleObject pour terminer son thread à partir d'une fonction externe (à ce propos il y a une petite erreur de nommage des handles dans la FAQ du coté des
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
HANDLE m_hEndThread;
HANDLE m_hWaitThread;.
avec un h de trop)


Je créé donc mon thread comme prévu dans la FAQ auquel je rajoute mon WaitForSingleObject (non bloquant si j'ai bien suivi)


Création du thread
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
bool MainDialog::InitThread()
{
	m_pThread = AfxBeginThread(ThreadFunc, this);
	if(!m_pThread)
	{
		// Impossible de créer le thread !
		return false;
	}
	return true;              
}
 
 
//
//
//
UINT MainDialog::ThreadFunc(LPVOID pvParam)
{
    MainDialog  *pThis=reinterpret_cast< MainDialog *>( pvParam) ;
 
	// Votre code
 
	while (1){
		::PostMessage(*pThis,WM_TEST,0,0);
		if(::WaitForSingleObject(pThis->m_hEndThread, 0) == WAIT_OBJECT_0)	
		{
			// signale l'objet event d'attente et sort.
			::SetEvent(pThis->m_hWaitThread);
			return 0;
		} 
		Sleep(1000);
	}
 
    return 0 ;
}
dans mon thread j'invoque un message privé :ostMessage qui lance une fonction qui écrit "coucou" dans une editbox.

maintenant je souhaite démarrer mon Thread à partir d'un bouton et l'arrêter à partir d'un autre, pour cela je fais:

Bouton de démarrage de Thread
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
void MainDialog::OnClickBtnCallDecrac() 
{
	// TODO: Add your control notification handler code here
	CString tempText;
	CString cBtnName = "Thread Demarré";
	GetDlgItem(FLD_DEBUGEDIT)->GetWindowText(tempText);
	if (tempText == ""){
		GetDlgItem(FLD_DEBUGEDIT)->SetWindowText(cBtnName);
	}
	else {
		GetDlgItem(FLD_DEBUGEDIT)->SetWindowText(cBtnName + "\r\n" + tempText);
	}
	//PostMessage(WM_TEST);
	InitThread();
}
Bouton d'arret du thread

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
void MainDialog::OnCallHld() 
{
	// TODO: Add your control notification handler code here
	CString tempText;
	CString cBtnName = "Thread Arrete";
	GetDlgItem(FLD_DEBUGEDIT)->GetWindowText(tempText);
	if (tempText == ""){
		GetDlgItem(FLD_DEBUGEDIT)->SetWindowText(cBtnName);
	}
	else {
		GetDlgItem(FLD_DEBUGEDIT)->SetWindowText(cBtnName + "\r\n" + tempText);
	}
	::SetEvent(m_hEndThread);
 
	// attend que le thread soit terminé
	::WaitForSingleObject(m_hWaitThread, INFINITE);
 
	// fermeture dans handles
	::CloseHandle(m_hEndThread);
	::CloseHandle(m_hWaitThread);
}
avec ceci, après avoir cliqué sur le bouton d'arret, mon thread continue de tourner et de m'afficher "coucou" dans mon editbox.
Quelqu'un verrait-il mon erreur ?

Merci d'avance