我是这样写的:
void CTest6Dlg::OnOK() 
{
          start.SetEvent();
if(WaitForSingleObject(start,2000)==WAIT_OBJECT_0)
MessageBox("normal!"); if(WaitForSingleObject(start,2000)==WAIT_TIMEOUT)
         MessageBox("waitout!");
}
但是执行时,两个对话框都出现了,请问是什么问题?

解决方案 »

  1.   

    CEvent start;
    start.SetEvent();
    //if(WaitForSingleObject(start,2000)==WAIT_OBJECT_0)
     //  MessageBox("normal!");//start.SetEvent();
    if(WaitForSingleObject(start,2000)==WAIT_TIMEOUT)
       MessageBox("waitout!");
    此是不弹出对话框。CEvent start;
    start.SetEvent();
    if(WaitForSingleObject(start,2000)==WAIT_OBJECT_0)
       MessageBox("normal!");start.SetEvent();
    if(WaitForSingleObject(start,2000)==WAIT_TIMEOUT)
       MessageBox("waitout!");
    此时是弹出一个。所以,可能的原因是WaitForSingleObject更改了start的状态但这不合的。所以,关注。。
      

  2.   

    第一个setevent是event处于激发状态,所以第一个wait成功,第一个messagebox显示
    第一个wait成功,而且没有resetevent,因此第二个wait肯定会失败,两秒后超时,第二个messagebox也出来了
      

  3.   

    event是与线程无关的,即该线程第一次调用waitForSingleObject则可以获取信号量,第二次调用的时候不会因为该线程已经拥有该信号量就返回,因为该Event现在是无信号状态.所以如果你给定了INFINITE参数,则死锁了,当然,如果你给定了2000毫秒,则等待一会儿就告诉你超时了.
      

  4.   

    同意二楼~~~
    你可以通过ELSE来进行判别就可以了~~~
      

  5.   

    第一个wait后,start不是处于信号态吗?resetevent,是将start改成非信号态,为什么还要调用?
      

  6.   

    同意ifhxfjb(New人)的说法,另外再强调一下,当第一次调用Wait后start就处于无信号状态
      

  7.   

    第一个wait后,start不是处于信号态吗?resetevent,是将start改成非信号态,为什么还要调用?evet对象实例化的时候可以设置手动重置和自动重置如果是手动重置wait阻塞等待激发,激发后,event必须被resetevent才能重新变为非激发状态
    否则,继续wait就始终返回了如果是自动重置,那么wait阻塞等待激发,返回后event自动被置为非激活。继续wait可以阻塞知道event再次被激发
      

  8.   

    CEvent被设置了,但是waitforsingleobject为什么没有被激活?
    你肯定是这样写的:CEvent start;注意这里是默认的,默认的event是自动设置的,所以
    当你执行完
    if(WaitForSingleObject(start,2000)==WAIT_OBJECT_0)
    MessageBox("normal!");
    这时start已经被自动置为非激发状态了.
    所以当你执行
    if(WaitForSingleObject(start,2000)==WAIT_TIMEOUT)
             MessageBox("waitout!");
    自然就是超时提示了.给分吧