Bonjour à tous

Je regardais un exemple d'utilisation de Thread dans la FAQ : FAQ Thread

Voilà où se trouve ma question :
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();
     }
}
** En rouge **
À 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 ?