windows中的WaitForSingleObject和WaitForMultipleObjects

來源:互聯網
上載者:User

 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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.