(转)WaitForSingleObject函数的使用

WaitForSingleObject 函数

DWORD WaitForSingleObject(

HANDLE hObject,

DWORD dwMilliseconds

);

第一个参数hObject标识一个能够支持被通知/未通知的内核对象(前面列出的任何一种对象都适用)。

第二个参数dwMilliseconds允许该线程指明,为了等待该对象变为已通知状态,它将等待多长时间。(INFINITE为无限时间量,INFINITE已经定义为0xFFFFFFFF(或-1))

传递INFINITE有些危险。如果对象永远不变为已通知状态,那么调用线程永远不会被唤醒,它将永远处于死锁状态,不过,它不会浪费宝贵的C P U时间。

例子:

DWORD dw = WaitForSingleObject(hProcess, 5000);

switch(dw)

{

case WAIT_OBJECT_0:

// The process terminated.

break;

case WAIT_TIMEOUT:

// The process did not terminate within 5000 milliseconds.

break;

case WAIT_FAILED:

// Bad call to function (invalid handle?)

break;

}

上面这个代码告诉系统,在特定的进程(hProcess)终止运行(进程hProcess终止运行变成已经通知)之前,或者在5000m s时间结束之前,调用线程不应该变为可调度状态。

WaitForSingleObject的返回值能够指明调用线程为什么再次变为可调度状态。

如果线程等待的对象变为已通知状态,那么返回值是WAIT_OBJECT_0。

如果设置的超时已经到期,则返回值是WAIT_TIMEOUT。

如果将一个错误的值(如一个无效句柄)传递给WaitForSingleObject,那么返回值将是WAIT_FAILED(若要了解详细信息,可调用GetLastError)。

WaitForMultipleObjects函数

WaitForMultipleObjects函数与WaitForSingleObject函数很相似,区别在于它允许调用线程同时查看若干个内核对象的已通知状态:

DWORD WaitForMultipleObjects(

DWORD dwCount,

CONST HANDLE* phObjects,

BOOL fWaitAll,

DWORD dwMilliseconds

);

dwCount参数用于指明想要让函数查看的内核对象的数量。这个值必须在1与MAXIMU M_WAIT_OBJECTS(在Windows头文件中定义为64)之间。

phObjects参数是指向内核对象句柄的数组的指针。

可以以两种不同的方式来使用WaitForMultipleObjects函数。

一种方式是让线程进入等待状态,直到指定内核对象中的任何一个变为已通知状态。

另一种方式是让线程进入等待状态,直到所有指定的内核对象都变为已通知状态。

fWaitAll参数告诉该函数,你想要让它使用何种方式。如果为该参数传递TRUE,那么在所有对象变为已通知状态之前,该函数将不允许调用线程运行。

dwMilliseconds参数的作用与它在WaitForSingleObject中的作用完全相同。如果在等待的时候规定的时间到了,那么该函数无论如何都会返回。。

WaitForMultipleObjects函数的返回值告诉调用线程,为什么它会被重新调度。可能的返回值是WAIT_FAILED和WAIT_TIMEOUT。如果为fWaitAl l参数传递TRUE,同时所有对象均变为已通知状态,那么返回值是WAIT_OBJECT_0。如果为fWaitAll传递FALSE,那么一旦任何一个对象变为已通知状态,该函数便返回。在这种情况下,你可能想要知道哪个对象变为已通知状态。返回值是WAIT_OBJECT_0与(WAIT_OJECT_0 + dwCount-1)之间的一个值。换句话说,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那么应该从返回值中减去WAIT_OBJECT_0。产生的数字是作为第二个参数传递给WaitForMultipleObjects的句柄数组中的索引。该索引说明哪个对象变为已通知状态。

下面是说明这一情况的一些示例代码

HANDLE h[3];

h[0] = hProcess1;

h[1] = hProcess2;

h[2] = hProcess3;

DWORD dw = WaitForMultipleObjects(3, h, FALSE, 5000);

switch(dw)

{

case WAIT_FAILED:

// Bad call to function (invalid handle?)

break;

case WAIT_TIMEOUT:

// None of the objects became signaled within 5000 milliseconds.

break;

case WAIT_OBJECT_0 + 0:

// The process identified by h[0] (hProcess1) terminated.

break;

case WAIT_OBJECT_0 + 1:

// The process identified by h[1] (hProcess2) terminated.

break;

case WAIT_OBJECT_0 + 2:

// The process identified by h[2] (hProcess3) terminated.

break;

}

转自http://www.cnblogs.com/fangyukuan/archive/2010/09/03/1817095.html

时间: 2024-10-11 07:15:08

(转)WaitForSingleObject函数的使用的相关文章

C++ win开发 WaitForSingleObject函数

C++涉及到多线程时  会经常用到WINAPI WaitForSingleObject函数 但是因为很多网上资料 直接参考官网的英文翻译 很多地方比较晦涩难理解 个人也做了一些测试 才弄清楚了这个函数的一些使用 首先看百度上的说明 WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回:如果超时时间已经到达dwMilliseconds毫

WaitForSingleObject函数的使用

WaitForSingleObject 的用法: DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 函数解析: 参数 hHandle 是一个事件的句柄,第二个参数 dwMilliseconds 是时间间隔.如果时间是有信号状态返回WAIT_OBJECT_0 ,如果时间超过 dwMilliseconds 值但时间事件还是无信号状态则返回WAIT_TIMEOUT . hHandle 可以是下列对象的句柄: Chang

Windows API一日一练 43 WaitForSingleObject函数

上面已经介绍怎么样创建一个简单的线程,在那里就需要使用函数WaitForSingleObject,它是用来做什么的呢?其实它是用来实现等待线程结束的,它的机理是这样的,通知Windows操作系统,现在我进入睡眼状态,当我关注的对象条件是否满足,如果满足了就吵醒我.在那里关注的对象是线程是否退出,这是一个条件测试.如果不等待线程关闭,就去删除线程的资源,就会出错的.使用前面的线程是简单一些,但它不合适复用,现在就使用C++的类来封装一个比较好用的类,这样就可以很方便地创建很多线程来使用,当然还可以

WaitForSingleObject 和 WaitForMultipleObjects函数

1.WaitForSingleObject 等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止.这些等待函数中最常用的是WaitForSingleObject: DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds); 当线程调用该函数时,第一个参数hObject标识一个能够支持被通知/未通 知的内核对象.第二个参数dwMilliseconds.允许该线程指明,为了等待该对象变为已通知状态,它将等待多

事件函数SetEvent、PulseEvent与WaitForSingleObject详解

系统核心对象中的Event事件对象,在进程.线程间同步的时候是比较常用,发现它有两个出发函数,一个是SetEvent,还有一个PulseEvent, 两者的区别是: SetEvent为设置事件对象为有信号状态:而PulseEvent也是将指定的事件设为有信号状态, 不同的是如果是一个人工重设事件,正在等候事件的.被挂起的所有线程都会进入活动状态,函数随后将事件设回,并返回:如果是一个 自动重设事件,则正在等候事件的.被挂起的单个线程会进入活动状态,事件随后设回无信号,并且函数返回. 也就是说在自

线程等待WaitXXXXX()函数系列之WaitForSingleObject和WaitForMultipleObject

Wait*()函数族可以来实现事件的检测,改函数可以实现单信号和多信号的侦测. 可能我这么说大家可能会有点迷迷糊糊.不急,我们先来介绍两个函数. 第一个是用于单信号侦测.WaitForSingleObject() 函数原型 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); hHandle对象句柄.可以指定一系列的对象,如Event.Job.Memory resourcenotification.Mutex.Pro

WaitForSingleObject用法

对应函数 编辑 VC声明 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 参数 编辑 hHandle[in]对象句柄.可以指定一系列的对象,如Event.Job.Memory resource notification.Mutex.Process.Semaphore.Thread.Waitable timer等. dwMilliseconds[in]定时时间间隔,单位为milliseconds(毫秒).如果指定

WaitForSingleObject用法介绍

WaitForSingleObject的用法 DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); 参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔.如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT. hHandle可以是下列对象的句柄: Change notification Cons

CreateEvent、SetEvent、ResetEvent和WaitForSingleObject

事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于"开"状态,我们称其为"有信号",否则称为"无信号".可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是"无信号"就让该线程睡眠,这样该线程占用的CPU时间就比较少. 产生事件对象的函数如下: (1)CreateEvent 函数原型: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttribu