1. 程式人生 > >Windows API一日一練 43 WaitForSingleObject函數

Windows API一日一練 43 WaitForSingleObject函數

ret 一個 調試 bre 需要 Nid read void tps

上面已經介紹怎麽樣創建一個簡單的線程,在那裏就需要使用函數WaitForSingleObject,它是用來做什麽的呢?其實它是用來實現等待線程結束的,它的機理是這樣的,通知Windows操作系統,現在我進入睡眼狀態,當我關註的對象條件是否滿足,如果滿足了就吵醒我。在那裏關註的對象是線程是否退出,這是一個條件測試。如果不等待線程關閉,就去刪除線程的資源,就會出錯的。使用前面的線程是簡單一些,但它不合適復用,現在就使用C++的類來封裝一個比較好用的類,這樣就可以很方便地創建很多線程來使用,當然還可以繼承它,實現更復雜的功能,下面就來學習這個例子。 函數WaitForSingleObject聲明如下:
WINBASEAPI DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, __in DWORD dwMilliseconds ); hHandle是等待對象的句柄。 dwMilliseconds是等待的時間條件,可以永遠等待下去。 調用這個函數的例子如下: #001 #pragma once #002 #003 //線程類。 #004 //蔡軍生 2007/09/23 #005 class CThread #006 { #007 public: #008 #009 CThread(void) #010 { #011 m_hThread = NULL;
#012 } #013 #014 virtual ~CThread(void) #015 { #016 if (m_hThread) #017 { #018 //刪除的線程資源。 #019 ::CloseHandle(m_hThread); #020 } #021 #022 } #023 #024 //創建線程 #025 HANDLE CreateThread(void) #026 { #027 //創建線程。 #028 m_hThread = ::CreateThread(
#029 NULL, //安全屬性使用缺省。 #030 0, //線程的堆棧大小。 #031 ThreadProc, //線程運行函數地址。 #032 this, //傳給線程函數的參數。 #033 0, //創建標誌。 #034 &m_dwThreadID); //成功創建後的線程標識碼。 #035 #036 return m_hThread; #037 } #038 #039 //等待線程結束。 #040 void WaitFor(DWORD dwMilliseconds = INFINITE) #041 { #042 //等待線程結束。 #043 ::WaitForSingleObject(m_hThread,dwMilliseconds); #044 } #045 #046 protected: #047 // #048 //線程運行函數。 #049 //蔡軍生 2007/09/21 #050 // #051 static DWORD WINAPI ThreadProc(LPVOID lpParameter) #052 { #053 //輸出到調試窗口。 #054 ::OutputDebugString(_T("ThreadProc線程函數運行/r/n")); #055 #056 //線程返回碼。 #057 return 0; #058 } #059 #060 protected: #061 HANDLE m_hThread; //線程句柄。 #062 DWORD m_dwThreadID; //線程ID #063 #064 }; #065 使用這個線程: #001 // #002 // 響應命令. #003 // 蔡軍生 2007/09/21 QQ:9073204 #004 // #005 LRESULT CCaiWinMsg::OnCommand(int nID,int nEvent) #006 { #007 // 菜單選項命令響應: #008 switch (nID) #009 { #010 case IDC_CREATEBTN: #011 //顯示一個按鈕。 #012 if (!m_hBtn) #013 { #014 m_hBtn = CreateWindow(_T("BUTTON"),_T("按鈕"), #015 WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, #016 50,50,100,32, #017 m_hWnd,(HMENU)IDC_BTN,m_hInstance,NULL); #018 } #019 break; #020 case IDC_BTN: #021 { #022 CThread threadDemo; #023 threadDemo.CreateThread(); #024 threadDemo.WaitFor(); #025 #026 // #027 OutputDebugString(_T("按鈕按下/r/n")); #028 } #029 break; #030 default: #031 return CCaiWin::OnCommand(nID,nEvent); #032 } #033 #034 return 1; #035 }

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

Windows API一日一練 43 WaitForSingleObject函數