WaitForMultipleObjects

DWORD WaitForMultipleObject(DWORD dwCount , CONST HANDLE* phObject, BOOL fWaitAll, DWORD dwMillisecinds);
  dwCount参数用于指明想要让函数查看的内核对象的数量。这个值必须在1与MAXIMUM_WAIT_OBJECTS(在Windows头文件中定义为64之间.
  phObjects参数是指向内核对象句柄的数组的指针。可以以两种不同的方式来使用WaitForMultipleObjects函数。一种方式是让线程进入等待状态,直到指定内核对象中的任何一个变为已通知状态。另一种方式是让线程进入等待状态,直到所有指定的内核对象都变为已通知状态。
  fWaitAll参数告诉该函数,你想要让它使用何种方式。如果为该参数传递TRUE,那么在所有对象变为已通知状态之前,该函数将不允许调用线程运行。
  dwMil liseconds参数该参数的作用与它在WaitForSingleObject中的作用完全相同。如果在等待的时候规定的时间到了,那么该函数无论如何都会返回。同样,通常为该参数传递INFINITE,但是在编写代码时应该小心,以避免出现死锁情况。
  WaitForMultipleObjects函数的返回值告诉调用线程,为什么它会被重新调度。可能的返回值是WAIT_FAILED和WAIT_TIMEOUT,这两个值的作用是很清楚的。如果为f WaitAll参数传递TRUE,同时所有对象均变为已通知状态,那么返回值是WAIT_OBJECT_0。如果为fWaitAll传递FALSE,那么一旦任何一个对象变为已通知状态,该函数便返回。在这种情况下,你可能想要知道哪个对象变为已通知状态。返回值是WAIT_OBJECT_0与(WAIT_OBJECT_0 + dwCount-1)之间的一个值。换句话说,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那么应该从返回值中减去WAIT_OBJECT_0。产生的数字是作为第二个参数传递给WaitForMultipleObjects的句柄数组中的索引。该索引说明哪个对象变为已通知状态。
  附加一个浅显的例子,以便大家更好的理解这个函数:
  (注意:下面的例子还包含了线程优先级的设置。在VC6.0中用Win32控制台下调试通过。)
  #include <windows.h>
  #include <stdio.h>
  DWORD WINAPI ThreadIdleProc(LPVOID lpParam)
  {
  int i = 0;
  while(i++<10)
  {
  printf("Idle Thread is running.\n");
  }
  return 0;
  }
  DWORD WINAPI ThreadNormalProc(LPVOID lpParam)
  {
  int i = 0;
  while (i++<10)
  {
  printf("Normal Thread is running.\n");
  }
  return 0;
  }
  int main(int argc,char* rgv[])
  {
  HANDLE h[2];
  DWORD dwThreadID;
  h[0] = ::CreateThread(NULL,0,ThreadIdleProc,NULL,CREATE_SUSPENDED,&dwThreadID);
  ::SetThreadPriority(h[0],THREAD_PRIORITY_IDLE);//设置线程优先级
  ::ResumeThread(h[0]);//唤醒
  h[1] = ::CreateThread(NULL,0,ThreadNormalProc,NULL,CREATE_SUSPENDED,&dwThreadID);//CREATE_SUSPENDED设置为0是标示立刻执行,则不需要下面的两个函数
  ::SetThreadPriority(h[1],THREAD_PRIORITY_NORMAL);
  ::ResumeThread(h[1]);
  DWORD dw;
  //第3、4个参数设置为TRUE、INFINITE时,等待所有线程执行完毕才返回,
  //为如下设置时,只要有一个线程为可信状态就返回
  dw = ::WaitForMultipleObjects(2,h,FALSE,5000);
  switch(dw)
  {
  case WAIT_FAILED:
  break;
  case WAIT_TIMEOUT:
  break;
  case WAIT_OBJECT_0:
  break;
  case WAIT_OBJECT_0+1:
  break;
  default:;
  }
  ::CloseHandle(h[0]);
  ::CloseHandle(h[1]);
  return 0;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值