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