CEvent g_Async;
Thread1()
{
g_Async.SetEvent();
}
Thread2
{
if(WAIT_OBJECT_0==WaitForSingleObject(g_Async.m_hObject,1))//1ms
dosomething1();
dosomething2();
}
如果dosomething1()和dosomething2()耗时较长,而这期间Thread1中执行了多次SetEvent();Thread2中WaitForSingleObject还能一次不少的得到这些事件吗?会不会丢失?
类似地,OnMessage()耗时较长,这期间PostMessage多次,OnMessage()还能一次不少的得到这些消息吗?会不会丢失?

解决方案 »

  1.   

    这个很少用,我到现在都没用过,用HANDLE g_Event吧;
    OnMessage一般情况下是可以收到的,因为你的消息会排队处理,但postmessage是立即返回的,从它的返回值是无法判断消息是否已响应了的.
      

  2.   

    SetEvent只是将事件置为signaled状态,你调用多次和调用一次并没有什么区别,Thread2中肯定会丢失,如果要一次一次的执行,你应该在两线程间做同步PostMessage会将消息添加到消息队列,这些消息会保留直到被处理,但是如果长时间得不到处理导致post消息队列长度过长就可能丢弃后面的消息,  2000/XP系统默认的消息队列长度是10000,要修改也不能小于4000Windows 2000/XP: There is a limit of 10,000 posted messages per message queue. This limit should be sufficiently large. If your application exceeds the limit, it should be redesigned to avoid consuming so many system resources. To adjust this limit, modify the following registry key:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit. The minimum acceptable value is 4000. 
      

  3.   

    Event是用来同步的,不是用来传递数据的
    多次setevent 不一定会收到多次的信号除非你reset event及时
      

  4.   

    如果dosomething1()和dosomething2()耗时较长,而这期间Thread1中执行了多次SetEvent();Thread2中WaitForSingleObject还能一次不少的得到这些事件吗?会不会丢失? 
    ================
    你都已经执行到dosomething1()了,WaitForSingleObject已经从阻塞状态中解除过来了,怎么还能得到通知呢?WaitForSingleObject都已经执行结束了。
      

  5.   

    同步,为什么仅等待1ms,而不是INFINITE
      

  6.   

    我这里只是一个示意,写的不全.不错,用INFINITE可以同步.上面也有意义,如果有信号则执行dosomething1(); 再执行dosomething2();
    超时的话则执行dosomething2();
      

  7.   

    谢谢大家的热情讨论,有答案了.Ryanwen接分
      

  8.   

    CEvent 不行,机制不一样。你描述的案例,需要用 CSemaphore 而不是 CEvent.