Windows API一日一練(43)WaitForSingleObject函數

來源:互聯網
上載者:User
 

上面已經介紹怎麼樣建立一個簡單的線程,在那裡就需要使用函數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 }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.