zoukankan      html  css  js  c++  java
  • WaitForSingleObject和WaitForMultipleObjects使用详解

     WaitForSingleObject和WaitForMultipleObjects使用详解


    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执行一次,当设置事件为有信号状态时,线程就执行完毕了。
     
     
    WaitForMultipleObjects
     
    The WaitForMultipleObjects function returns when one of the following occurs:
     

    Either any one or all of the specified objects are in the signaled state.
    The time-out interval elapses.
     
    To enter an alertable wait state, use the WaitForMultipleObjectsEx function.
    DWORD WaitForMultipleObjects(
      DWORD nCount,             // number of handles in array
      CONST HANDLE *lpHandles,  // object-handle array
      BOOL bWaitAll,            // wait option
      DWORD dwMilliseconds      // time-out interval
    );
     

     
    Parameters
     
     
    nCount
    [in] Specifies the number of object handles in the array pointed to by lpHandles. The maximum number of object handles is MAXIMUM_WAIT_OBJECTS.
    lpHandles
    [in] Pointer to an array of object handles. For a list of the object types whose handles can be specified, see the following Remarks section. The array can contain handles to objects of different types. It may not contain the multiple copies of the same handle.
    If one of these handles is closed while the wait is still pending, the function's behavior is undefined.

    Windows NT/2000/XP: The handles must have SYNCHRONIZE access. For more information, see Standard Access Rights.

    Windows 95/98/Me: No handle may be a duplicate of another handle created using DuplicateHandle.
     
    bWaitAll
    [in] Specifies the wait type. If TRUE, the function returns when the state of all objects in the lpHandles array is signaled. If FALSE, the function returns when the state of any one of the objects is set to signaled. In the latter case, the return value indicates the object whose state caused the function to return.
    dwMilliseconds
    [in] Specifies the time-out interval, in milliseconds. The function returns if the interval elapses, even if the conditions specified by the bWaitAll parameter are not met. If dwMilliseconds is zero, the function tests the states of the specified objects and returns immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses.
     
    Return Values
     
    If the function succeeds, the return value indicates the event that caused the function to return. This value can be one of the following.
  • 相关阅读:
    8月24 杂七杂八
    胡思乱想
    前端思考题
    前端经典面试题
    一些被废弃的东西
    关于设置img图片大小优先级的问题
    关于 removeChild()删除节点
    关于前端基本要求及一些题
    关于 Oracle 11g 先决条件检查失败的解决办法
    《现代前端技术解析》第一章读书笔记(未完成)
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994909.html
Copyright © 2011-2022 走看看