您的位置:首页 > 移动开发 > Objective-C

windows中的WaitForSingleObject和WaitForMultipleObjects

2009-02-18 14:50 567 查看
The WaitForSingleObject function checks the current state of the specified object. If the object's state is nonsignaled, the calling thread enters the wait state. It uses no processor time while waiting for the object state to become signaled or the time-out interval to elapse.

具体用法:控制线程何时执行 间隔执行某一线程函数体

1:控制线程何时执行

在下面这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环,因为g_event是全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程。

CEvent g_event;

UINT CFlushDlg::MyThreadProc( LPVOID pParam )

{

WaitForSingleObject(g_event,INFINITE);

For(;;)

{

…………

}

return 0;

}

2:间隔执行某一线程函数体

在这个线程函数中可以可以通过设置MT_INTERVAL来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔MT_INTERVAL执行一次,当设置事件为有信号状态时,线程就执行完毕了。

UINT CFlushDlg::MyThreadProc( LPVOID pParam )

{

while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)

{

………………

}

return 0;

}

WaitForMultipleObject

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;

  }

z转自:http://hi.baidu.com/%C0%B6ɫ%D3%F1%C3װ%F4%D7%D3/blog/item/5bd3e588b702fd93a4c272bf.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: