Bonjour,
après quelques heures de lecture de la FAQ et des multiples sujets lancés sur l'arret des thread :D 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é desavec un h de trop)Code:
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é ::PostMessage qui lance une fonction qui écrit "coucou" dans une editbox.Code:
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 ; }
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 threadCode:
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:
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 ;)