用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);