c++线程学习5等待函数

来源:互联网 发布:局域网内部监控软件 编辑:程序博客网 时间:2024/05/21 08:57
WaitForSingleObject的用法  


WaitForSingleObject的用法
DWORD WaitForSingleObject(

  HANDLE hHandle,

  DWORD dwMilliseconds

);


参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。

hHandle可以是下列对象的句柄:

  Change notification 
Console input 
Event 
Job 
Memory resource notification 
Mutex 
Process 
Semaphore 
Thread 
Waitable timer 








WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。在这里举个例子:

先创建一个全局Event对象g_event:

  CEvent g_event;

在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。

下面是一个线程函数MyThreadPro()

UINT CFlushDlg::MyThreadProc( LPVOID pParam ) 






  WaitForSingleObject(g_event,INFINITE); 


  For(;;) 






  { 

  } 

  return 0; 






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



还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体

  UINT CFlushDlg::MyThreadProc( LPVOID pParam ) 


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



  { 



  } 



  return 0; 






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

2)简单说明WaitForSingleObject

DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMilliseconds);

参数hObject:要等待的内核对象的句柄。
参数dwMilliseconds: 设置的等待超时的时间,以毫秒为单位。可以设置为INGINIT。  
  顺便说一下,INFINITE已经定义为0xFFFFFFFF(或-1)。当然,传递INFINITE有些危险。如果对象永远不变为已
  通知状态,那么调用线程永远不会被唤醒,它将永远处于死锁状态。
返回值:WAIT_OBJECT_0表示要等待的对象已经变为已通知的状态。
  WAIT_TIMEOUT表示设置的时间超时。
  WAIT_FAILED表示失败,可能是传入的handle不正确或其他的问题。
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;
}

3)简单说明WaitForMultipleObjects

DWORD WaitForMultipleObjects(DWORD dwCount,CONST HANDLE* phObjects,BOOL fWaitAll,DWORD dwMilliseconds);

参数dwCout:需要等待的内核对象的数量。
参数phObjects:需要等待的内核对象的是数组的指针。
参数fWaitAll:表示是否需要等待所有的内核对象。
参数dwMilliseconds:设置等待超时的时间。(同上函数)

返回值:WAIT_FAILED和WAIT_TIMEOUT同上函数。
 如果为fWaitAll参数传递TRUE,同时所有对象均变为已通知状态,那么返回值是WAIT_OBJECT_0。如果为fWaitAll传递FALSE ,那么一旦任何一个对象变为已通知状态,该函数便返回。在这种情况下,你可能想要知道哪个对象变为已通知状态。返回值是WAIT_OBJECT_0与(WAIT_OBJECT_0+dwCount- 1)之间的一个值。

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;
}