Bonjour,
apr�s quelques heures de lecture de la FAQ et des multiples sujets lanc�s sur l'arret des threadj'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
avec un h de trop)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 HANDLE m_hEndThread; HANDLE m_hWaitThread;.
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
dans mon thread j'invoque un message priv� :
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 ; }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
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 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(); }
avec ceci, apr�s avoir cliqu� sur le bouton d'arret, mon thread continue de tourner et de m'afficher "coucou" dans mon editbox.
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); }
Quelqu'un verrait-il mon erreur ?
Merci d'avance![]()
Partager