while(true)
{
     WaitForSingleObject( ReciveEvent,INFINITE);      if()
        {........}
}
如上代码!如果我把ResetEvent(ReciveEvent)放的位置不同的话效果不同。
while(true)
{
     WaitForSingleObject( ReciveEvent,INFINITE);
     ResetEvent(ReciveEvent);放这里的时候if(){.....}会被多次执行      if()
        {........}
      ResetEvent(ReciveEvent);放这里的时候if(){....}只执行一次!
}
SetEvent在另一个线程执行。为什么会出现上边所放位位置不同,执行情况不同的情况,ResetEvent都是执行成功的

解决方案 »

  1.   

    if()
    {........}这个里面是不是有SetEvent?
      

  2.   

    DEBUG,跟进去看看!
    蹭点分!
      

  3.   

    while(true)
    {
         WaitForSingleObject( ReciveEvent,INFINITE);
         ResetEvent(ReciveEvent);放这里的时候if(){.....}会被多次执行//位置1      if()
            {........}
          ResetEvent(ReciveEvent);放这里的时候if(){....}只执行一次!//位置2
    }
    我们来分析一下上面这种情况:
    首先根据你所说,该Event应该是一个手动复位的事件。
    1.当放在位置1的时候,事件复位后,就去执行 if (){....},在执行 if 期间,另一个线程完全有机会调用了SetEvent,导致在执行完if后,Waitfor函数等待的Event已经被激发(被另一个线程SetEvent)
    2.当放在位置2的时候,事件复位后,立刻返回while,然后又执行WaitFor,你可以看到ResetEvent与WaitFor的执行顺序非常接近。所以WaitFor会挂起等待。此时如果没有其他线程SetEvent的话。WaitFor将不会往下执行。结论:位置2也并不是只会执行1次if(){...},如果你运行程序1万次。只是 ResetEvent与WaitFor之间太近,近到其他线程不足以在它两者之间搞鬼(SetEvent)。位置2与WaitFor之间的距离就太远了,远到另一个线程可以在他们中间搞鬼(SetEvent)