对于WaitForSingleObject和WaitForMultipleObjects函数,如果里面的参数是event的法,则他们等的是这个事件的发生;这个俺理解。可是我看有些程序里面,WaitForSingleObject和WaitForMultipleObjects里面的参数是线程Thread的句柄Handle;请问这种情况下WaitForSingleObject和WaitForMultipleObjects到底等的是什么??

解决方案 »

  1.   

    The WaitForSingleObject function can wait for the following objects:
    Change notification 
    Console input 
    Event 
    Job 
    Memory resource notification 
    Mutex 
    Process 
    Semaphore 
    Thread 
    Waitable timer 
    for thread
    =================================================
    when active                non-signaled
    when terminated            signaledfor Event
    =================================================
    when SetEvent()            signaled
    when ResetEvent()          non-signaled
      

  2.   

    楼上的
    是 说等待所有的线程执行结束毕后,WaitForMultipleObjects就返回吗?
    还是说 所有的线程都开始执行,    WaitForMultipleObjects就返回?
      

  3.   

    创建线程或者进程后,他们的句柄处于"未激发"的状态,当线程函数返回或者进程退出的时候,他们的句柄处于"激发"状态,然后wait一类的函数就会返回了
      

  4.   

    "未激发"的状态??
    如果AfxBeginThread参数设置是0,即创建后立即执行呢?算激发还是未激发啊????
      

  5.   

    To what_a_big() :       我是在编写IOCP的时候碰到这个问题的;
           我在窗口上放置一个按钮,按钮的点击事件是:    首先对所有的工作者线程PostQueuedCompletionStatus一个特殊的标志【在PostQueuedCompletionStatus的overlapped参数里面设置】,当工作者线程里面这么写的
    while(TRUE){
            GetQueuedCompletionStatus(........)
    }如果GetQueuedCompletionStatus得到的overlapped是这个特殊标志的时候,工作者线程就return 0,这样按理说工作者线程就应当退出返回了;   这个按钮的点击事件接着就是执行WaitForMultipleObjects,可是问题在于这个时候程序就一直在WaitForMultipleObjects上呆住了,感觉程序就象死掉了;我查看日志,工作者线程没有接收到PostQueuedCompletionStatus出来的特殊标志【因为我在程序里面增加了如果工作者线程接收到这个特殊标志,就在日志里面提示,可是结果是在日志里面没有这个提示啊】;
       我想不应当是PostQueuedCompletionStatus或者工作者线程没有接收到这个标志,因为我试着在另外一个按钮的点击事件里面只执行PostQueuedCompletionStatus的,所有的工作者线程确实接收到这个标志【日志里面确实有提示】,并且返回了。   不知道这是为什么啊?让这个问题郁闷了好几天了,还是没有解决啊。
      

  6.   

    看我这个想例子,中是先弹出main,而不是KK
    注意看啊,我 threadfunc里sleep了1秒,
    (ThreadFunc没设置sleep 1秒的话,KK和main我也不知道是那儿先弹的)
    而我WaitForMultipleObjects了10秒
    这是 为什么了?
    不说要 线程执行完毕了还激活吗?
    怎么就弹出了main了了?void CEeDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    HANDLE _pThread[5]; int i;
    for (i= 0; i< 5; i++)
    {
    _pThread[i] = AfxBeginThread(ThreadFunc,
    NULL,
    THREAD_PRIORITY_NORMAL,
    0,
    0,
    NULL);
    }

     //Sleep(1000);  WaitForMultipleObjects(5,_pThread,true,10000);
     AfxMessageBox("main");}UINT CEeDlg::ThreadFunc(LPVOID ThreadArg)
    {
             Sleep(1000);
    AfxMessageBox("kk");
    return 1;
    }
      

  7.   

    _pThread[i] = AfxBeginThread(ThreadFunc,
    NULL,
    THREAD_PRIORITY_NORMAL,
    0,
    0,
    NULL);AfxBeginThread 返回的是CWinThread* 不是HANDLE用CreateThread
    HANDLE _pThread[5]; int i;
    for (i= 0; i< 5; i++)
    {
    DWORD dwThreadID = 0;
    _pThread[i] = ::CreateThread( NULL, 0, ThreadFunc, NULL, 0, &dwThreadID);
    }
     DWORD dwRet = WaitForMultipleObjects(5,_pThread,true,10000);
     DWORD dwError = ::GetLastError();
     AfxMessageBox("main");
    }
    DWORD WINAPI CWaitForMultipleObjectsDlg::ThreadFunc(LPVOID ThreadArg)
    {
             Sleep(1000);
    AfxMessageBox("kk");
    return 1;
    }
      

  8.   

    DWORD dwRet = WaitForMultipleObjects(5,_pThread,true,10000);
    使用了这个以后
    即便几个子线程ThreadFunc 5到6秒就搞定的事情
    也被硬生生的等了10秒
    我现在想知道
    怎样判断上面所建立的5个线程已经全部执行完毕
    (我的1个小程序要处理的东西用子线程做
    然后想判断下到底完成了没,可不知道怎么判断)
      

  9.   

    WaitFor*Object就是阻塞调用线程,直到制定对象(也就是参数句柄)进入“信号发出”状态。如果参数是线程句柄的话,那么这个线程结束的时候就会处于“信号发出状态”