几个等待API

WaitForSingleObject

WINBASEAPI
DWORD
WINAPI
WaitForSingleObject(
    _In_ HANDLE hHandle,
    _In_ DWORD dwMilliseconds
    );
//hHandle:        (事件)对象的句柄;
//dwMilliseconds:时间间隔,毫秒级

WaitForSingleObject 函数当出现如下一种情况时才返回:
1.指定的对象在有信号状态
2.超过指定的时间间隔

返回值:
WAIT_ABANDONED": 当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
WAIT_OBJECT_0: 核心对象已被激活
WAIT_TIMEOUT: 等待超时

函数说明:
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。

关于WAIT_ABANDONED返回值
假设有A、B两个线程和一个互斥量hMutex。如果A线程调用WaitForSingleObject获取到互斥量后,并没有调用ReleaseMutex来释放互斥量就终止了(如调用了ExitThread,TerminateThread)。然后线程B调用WaitForSingleObject就会返回WAIT_ABANDONED,并且线程B获取到互斥量,线程B使用完成后应该调用ReleasMutex释放互斥量。

当返回WAIT_ABANDONED时,应该检查一下互斥量所保护的资源的一致性。

WaitForMultipleObjects

WaitForMultipleObjects是Windows中的一个功能非常强大的函数,几乎可以等待Windows中的所有的内核对象

函数原型为:

DWORD WaitForMultipleObjects(  

  DWORD nCount,             // number of handles in the handle array  

  CONST HANDLE *lpHandles,  // pointer to the object-handle array  

  BOOL fWaitAll,            // wait flag  

  DWORD dwMilliseconds      // time-out interval in milliseconds  

);  

参数解析:
DWORD:         就是 Double Word, 每个word为2个字节的长度,DWORD双字即为4个字节,每个字节是8位。
nCount:        指定列表中的句柄数量  最大值为MAXIMUM_WAIT_OBJECTS(64)  
*lpHandles:    句柄数组的指针。lpHandles为指定对象句柄组合中的第一个元素 HANDLE类型可以为(Event,Mutex,Process,Thread,Semaphore)数组  
bWaitAll:      等待的类型,如果为TRUE,表示除非对象都发出信号,否则就一直等待下去;如果FALSE,表示任何对象发出信号即可 
dwMilliseconds:指定要等候的毫秒数。如设为零,表示立即返回。如指定常数INFINITE,则可根据实际情况无限等待下去 

函数的返回值有:
 WAIT_ABANDONED_0:所有对象都发出消息,而且其中有一个或多个属于互斥量(一旦拥有它们的进程中止,就会发出信号)
 WAIT_TIMEOUT:对象保持未发信号的状态,但规定的等待超时时间已经超过
 WAIT_OBJECT_0:所有对象都发出信号
 WAIT_IO_COMPLETION:(仅适用于WaitForMultipleObjectsEx)由于一个I/O完成操作已作好准备执行,所以造成了函数的返回
 WAIT_FAILED:则表示函数执行失败,会设置GetLastError
  • WAIT_ABANDONED_0:如果你等待的对象中有任何mutexes,那么返回值可能从WAIT_ABANDONED_0到WAIT_ABANDONED_0+nCount-1.
  • WAIT_TIMEOUT:如果因时间终了而返回,则返回值是WAIT_TIMEOUT,类似WaitForSingleObject().
  • WAIT_OBJECT_0:
    如果bWaitAll是TRUE,则返回值将是WAIT_OBJECT_0.
    如果bWaitAll是FALSE,那么将返回值减去WAIT_OBJECT_0,就表示数组中的哪一个handle被激发了。
  • WAIT_FAILED:如果函数失败,则返回WAIT_FAILED。可以使用GetLastError找出失败原因。

实例

#include 

HANDLE m_hEvent[2];
//两事件  


DWORD WINAPI MyThreadProc(LPVOID lpParam)
{
    while (TRUE)
    {  //每次等500毫秒   
        int nIndex = WaitForMultipleObjects(2, m_hEvent, FALSE, 500);
        
        if (nIndex == WAIT_OBJECT_0) //第一个事件发生    
        {
            //第一个事件发生 
        }
        else if (nIndex == WAIT_OBJECT_0 + 1)//第二个事件
        {
            //第二个事件发生
        }
        else if (nIndex == WAIT_TIMEOUT) //超时500毫秒    
        {   //超时可作定时用    
        }
    }
    OutputDebugString("线程结束. /n");
    return 0L;
}

void main()
{
    m_hEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
    m_hEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
    CreateThread(NULL, 0, MyThreadProc, NULL, 0, NULL);
}

SingleObjectAndWait

MsgWaitForMultipleObjects

MsgWaitForMultipleObjects和MsgWaitForMultipleObjectsEx这些函数与WaitForMultipleObjects函数十分相似。差别在于它们允许线程在内核对象变成已通知状态或窗口消息需要调度到调用线程创建的窗口中时被调度。
创建窗口和执行与用户界面相关的任务的线程,应该调用MsgWaitForMultipleObjectsEx函数,而不应该调用WaitForMultipleObjects函数,因为后面这个函数将使线程的用户界面无法对用户作出响应。

你可能感兴趣的:(wait)