Bonjour.

J'ai un comportement bizarre avec "System::Threading::ManualResetEvent".

Celui-ci est sensé bloquer un thread avec "WaitOne()" et le débloquer avec "Set()".

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
 
using namespace System;
using namespace System::Threading;
 
//bool bEventFoireux = false;
 
ref class ThreadWithState{
 
  public:
 
    ThreadWithState(ManualResetEvent^% ResetEvent, int iWait) : m_ResetEvent(ResetEvent), m_iWait(iWait), bEventFoireux(false){}
    ~ThreadWithState(){}
    void ThreadProc();
 
  private:
 
    ManualResetEvent^ m_ResetEvent;
    int m_iWait;
    bool bEventFoireux;
};
 
void ThreadWithState::ThreadProc(){
 
  //static bool bEventFoireux = false;
 
  m_ResetEvent->WaitOne();
 
  if(bEventFoireux)
    Console::WriteLine("La prog DotNet c'est foireux !");
 
  bEventFoireux = true;
 
  int iRes = 0;
 
  System::Threading::Thread::Sleep(m_iWait);
 
  for(int i = 0; i < 5000; i++)
    iRes += i;
 
  bEventFoireux = false;
  m_ResetEvent->Set();
}
 
[STAThreadAttribute]
int main(array<System::String ^> ^args){
 
  ManualResetEvent^ ResetEvent = gcnew ManualResetEvent(true);
 
  int iVal = 0;// modifier cette valeur avec 1, 10, 100, 1452 par exemple
 
  ThreadWithState^ tws = gcnew ThreadWithState(ResetEvent, iVal);
 
  ThreadStart^ myThreadDelegate = gcnew ThreadStart(tws, &ThreadWithState::ThreadProc);
 
  array< Thread^>^ myThreadArray = gcnew array< Thread^>(11);
 
  for(int i = 0; i < 11; i++){
 
    Thread^ myThread  = gcnew Thread(myThreadDelegate);
    myThreadArray[i] = myThread;
  }
 
  for(int i = 0; i < 11; i++){
 
    myThreadArray[i]->Start();
  }
 
  for(int i = 0; i < 11; i++){
 
    myThreadArray[i]->Join();
  }
 
  Console::WriteLine("FIN");
 
  return 0;
}
Le message non désiré "La prog DotNet c'est foireux !" apparaît selon le Sleep.

Est-ce que c'est moi qui suit foireux ou ManualResetEvent.

J'utilise le framework 2.0.

Merci de m'aider à comprendre.