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有返回值才執行后面的代碼。此外,當dwMilliseconds設置為特殊值0時,測試hHandle核心對象是否被激發,函數立即返回。

  返回值: 

  WAIT_ABANDONED:當hHandle為mutex時,如果擁有mutex的線程在結束時沒有釋放核心對象會引發此返回值。

  WAIT_OBJECT_0:核心對象已被激活

  WAIT_TIMEOUT:等待超時

  WAIT_FAILED:出現錯誤,可通過GetLastError得到錯誤代碼

   在這里舉個例子: 

  先創建一個全局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執行一次,當設置事件為有信號狀態時,線程就執行完畢了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM