vc技术内幕11章的一个例子
UINT ComputerFunc(LPVOID lpParam)
{
volatile int nTemp;
WaitForSingleObject(g_eventStart, INFINITE); for( g_nCount=0; g_nCount<CComputerDlg::m_nMax; ++g_nCount)
{
for( nTemp = 0; nTemp<1000; nTemp++)
{
if( WaitForSingleObject(g_eventKill, 0) == WAIT_OBJECT_0)
break;
}
} PostMessage((HWND)lpParam, WM_FINISH, 0, 0);
g_nCount = 0;
return 0;
}
g_eventKill如果是人工事件,线程运行后,g_eventKill.setEvent后线程立刻停止;
但是如果g_eventKill是自动重置事件,线程运行后,调用g_eventKill.setEvent线程不停止,一直运行;
疑惑:没有其它地方等待g_eventKill,为什么自动重置事件就不行呢?

解决方案 »

  1.   

    关键在于 CreateEvent 的第二个参数HANDLE CreateEvent(
      LPSECURITY_ATTRIBUTES lpEventAttributes,
                          // pointer to security attributes
      BOOL bManualReset,  // flag for manual-reset event
      BOOL bInitialState, // flag for initial state
      LPCTSTR lpName      // pointer to event-object name
    );
     
    bManualReset 
    Specifies whether a manual-reset or auto-reset event object is created. If TRUE, then you must use the ResetEvent function to manually reset the state to nonsignaled. If FALSE, the system automatically resets the state to nonsignaled after a single waiting thread has been released. 
      

  2.   

    不管是不是什么类型的事件
    我setevent以后 WaitForSignalObject就应该能等待到该事件,不是吗?
    现在的情况是手工事件可以等待到,自动重置的等待不到,然而就这一个地方调用了WaitForSignalObject,那么为什么还是等待不到自动事件?
      

  3.   

    用循环等事件是什么意思? 
    可以在 WaitForSingleObject 后加个TRACE或断点看是否执行到了
      

  4.   

    书上的一个例子
    循环目的就是消耗CPU时间 没什么作用
    例子就是演示事件的用法主循环用定时器获取g_nCount的值显示在进度条上就3个地方用到g_eventKill:
    CEvent g_eventKill;//全局变量
    g_eventKill.SetEvent(); //主线程中触发事件
    WaitForSingleObject(g_eventKill, 0) //辅助线程中检测事件,事件触发就终止线程
      

  5.   

    主线程用定时器获取g_nCount的值显示在进度条上
      

  6.   


      {
        HANDLE hEvent = CreateEvent(NULL, 
          FALSE, //automatically resets
          TRUE, //flag for initial state
          NULL);    WaitForSingleObject(hEvent, -1); //此处正常退出,因为前面的初始值是TRUE
        SetEvent(hEvent); //设置事件
        WaitForSingleObject(hEvent, -1); //此处正常退出,因为前面的SetEvent
        WaitForSingleObject(hEvent, 2000); //此处会超时退出    CloseHandle(hEvent);
      }    {
        HANDLE hEvent = CreateEvent(NULL, 
          TRUE, //manual-reset 
          TRUE, //flag for initial state
          NULL);
        
        WaitForSingleObject(hEvent, -1); //此处正常退出,因为前面的初始值是TRUE
        WaitForSingleObject(hEvent, -1); //此处正常退出,因为需要手动复位
        ResetEvent(hEvent); //重置事件
        WaitForSingleObject(hEvent, 2000); //此处会超时退出
        SetEvent(hEvent);
        WaitForSingleObject(hEvent, -1); //此处正常退出,因为前面的SetEvent
        
        CloseHandle(hEvent);
      } 
      

  7.   

    自动事件只等一次,等完后就自动变成无信号状态,手动的不调用resetevent一直有信号,内层循环每次只执行一次就break,自动的只有首次执行一次,后续的每次都要跑满1000次
      

  8.   

    自动重置事件 signal以后没有被等待过  不会被重置 是吧?