1. 程式人生 > >用Sleep或WaitForSingleObject實現執行緒的休眠

用Sleep或WaitForSingleObject實現執行緒的休眠

    Sleep函式可以實現這個功能:
    Sleep( DWORD dwMilliseconds );
    其中dwMillisenconds為要休眠的毫秒數,當dwMillisenconds為0時,CPU將把時間切片轉給優先順序較高的程序。
    但Sleep函式有個不好的地方,你不能讓它在中途停下來,如果我們要讓蜘蛛在兩個連結點之間的休眠10秒(10000毫秒)或者更長,而期間又想控制蜘蛛停止工作,會造成介面出現宕機狀態,因此Sleep函式只適合很短時間內(通常1000毫秒)的休眠,如果想讓休眠時間長一點,可以考濾使用WaitForSingleObject。

    WaitForSingleObject的用法:
DWORD WaitForSingleObject(
  HANDLE hHandle,
  DWORD dwMilliseconds
);
    引數hHandle是一個事件的控制代碼,第二個引數dwMilliseconds是時間間隔。如果時間是有訊號狀態返回WAIT_OBJECT_0,如果時間超過dwMilliseconds值但時間事件還是無訊號狀態則返回WAIT_TIMEOUT。

    例子:
 // 標頭檔案中宣告一個事件控制代碼
 HANDLE m_hEvent;
 // 程式初始化的地方建立事件
 m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
 // 執行緒執行到WaitForSingleObject時等待10000毫秒
 // 如果引數dwMillisenconds為INFINITE則無限時等待到m_hEvent有訊號
 // 如果是超過休眠時間則返回WAIT_TIMEOUT
 // 如果m_hEvent有訊號(程式其它地方設定m_hEvent為受信狀態),
 // 則在等待時間之內返回WAIT_OBJECT_0,
 ResetEvent(m_hEvent);
 DWORD dwWait = ::WaitForSingleObject(m_hEvent, 10000);
 if( dwWait == WAIT_TIMEOUT)
 {
   TRACE0("超時 /n");
   ...控制程式流程...
 }
 else if( dwWait == WAIT_OBJECT_0)
 {
   TRACE0("m_hEvent受信 /n");
   ...控制程式流程...
 }
// 在程式的外部或其它執行緒中想設定m_hEvent為受信狀態
// 在WaitForSingleObject處等待的執行緒將繼續執行
::SetEvent(pSpider->m_hEvent);
// 在程式最後關閉對像,對應CreateEvent
::CloseHandle(m_hEvent);