hHandle對象句柄。可以指定一系列的對象,如Event、Job、Memory resource notification、Mutex、Process、
Semaphore、Thread、Waitable timer等。
當核心對象有2個狀態:激發,未激發,
方法返回值:
1:在等待核心對象期間,對象變為激發狀態,返回WAIT_OBJECT_0
2:核心對象變成激發狀態之前,等待時間結束,返回WAIT_TIMEOUT
3:如果線程沒有釋放mutex,返回WAIT_ABANDONED
#include <iostream> #include <windows.h> using namespace std; DWORD WINAPI ThreadFun(PVOID par) { cout<<"線程方法正在執行..."<<endl; Sleep(3000); return 0; } int main() { DWORD ThreadID; HANDLE hThread=CreateThread(NULL,0,ThreadFun,(void*)0,0,NULL); while(TRUE) { //這里等待時間是設置的1秒鍾,可以設置為INFINITE(就不需要外面的死循環了) DWORD r= WaitForSingleObject(hThread,1000); if(r==WAIT_TIMEOUT) { cout<<"WAIT_TIMEOUT"<<endl;//輸出2-3次 continue; } else if(r==WAIT_OBJECT_0) { cout<<"WAIT_OBJECT_0"<<endl;//線程方法睡眠3秒以后輸出 break; } else { cout<<"hello"<<endl; continue; } } CloseHandle(hThread); system("PAUSE"); return 0; }
WaitForMultipleObjects
#include <iostream> #include <process.h> #include <windows.h> #define ThMax 3//線程數 using namespace std; unsigned __stdcall ThreadFun(void* par) { cout<<"線程"<<*((int*)par)<<"正在執行..."<<endl; Sleep(3000); return 0; } int main() { HANDLE hThreads[ThMax]; int par[]={1,2,3}; int i=0; while(TRUE) { if(i<3) { hThreads[i]=(HANDLE)_beginthreadex(NULL,0,&ThreadFun,(void*)&(par[i]),0,NULL); Sleep(500); } else { //詳細參考:http://msdn.microsoft.com/en-us/library/ms687025(v=vs.85).aspx //bWaitAll參數如果設置為TRUE,那么就必須所有核心對象是激發狀態才會返回,FALSE則一個就返回 DWORD r=WaitForMultipleObjects(3,hThreads,TRUE,1000); if(r==WAIT_TIMEOUT) { cout<<"WAIT_TIMEOUT"<<endl; continue; } else if(r==WAIT_OBJECT_0) { cout<<"WAIT_OBJECT_0"<<endl; break; } else { cout<<"等待"<<endl; continue; } } i++; } for(int i=0;i<ThMax;i++) { CloseHandle(hThreads[i]); } cout<<"執行完畢"<<endl; system("PAUSE"); return 0; }
本文版權歸kennyMc和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。