Bonjour à tous
Je regardais un exemple d'utilisation de Thread dans la FAQ : FAQ Thread
Voilà où se trouve ma question :
** En rouge **
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 // IMPORTANT: si vous appelez des fonctions membres // ou modifiez des données membres de CWorkerThread // veillez à que leur utilisation soit thread safe // car Execute() s'execute dans un autre thread contrairement // aux autres fonctions qui sont appelées depuis le thread principal // En particulier, il ne faut surtout pas appeler Stop() UINT CWorkerThread::Execute() { // exemple de code à exécuter DWORD start = ::GetTickCount(); do { // code de traitement ::Sleep( 1000 ); // simuler une opération de 1 sec // Faire appel à un CALLBACK m_pCallBackFct(...) } while ( this->m_StopThread == false ) ; DWORD end = ::GetTickCount(); // renvoyer un résultat : temps d'exécution this->ExecutionTime = end - start; return 0; } // m_pCallBackFct pointe sur une fonction du genre... void MyFunction() { if (...) { MyWorkerThread.Stop(); } }
À 2-3 reprises il m'est arrivé qu'il était NÉCESSAIRE que je puisse arrêter le thead (donc appeler STOP) à l'intérieur de ma fonction WorkerThread. Donc, exactement ce qu'il ne faut pas faire puisque cela provoquerait un Dead Lock.
Un des bonnes exemples que je puisse trouver c'est en .NET lorsqu'on utilise l'objet SerialPort, on a un Callback qui est appelé lorsque des données sont lu et à l'intérieur de cette événement on peut appeler m_SerialPort.Close(), qui lui arrêter le thread de lecture.
Avez-vous des suggestions quand à une solution ?
Partager