Windows API一日一練(44)wsprintf函數

來源:互聯網
上載者:User
  Windows API一日一練(44)wsprintf函數

接著上面,再繼續實現更加強大的線程類。從上面的C++類裡可以看到,要在靜態函數裡使用類的成員就需要擷取this指標,也就是通過CreateThread函數裡把類的this指標傳送進來的,這樣在函數ThreadProc裡的參數lpParameter就是this指標了。因此把參數lpParameter轉換為CThread類指標,這樣就可以使用類的成員。在這個例子裡使用wsprintf函數來格式化線程ID輸出來,下面就來詳細地分析例子吧。

函數wsprintf聲明如下:

WINUSERAPI
int
WINAPIV
wsprintfA(
    __out LPSTR,
    __in __format_string LPCSTR,
    ...);
WINUSERAPI
int
WINAPIV
wsprintfW(
    __out LPWSTR,
    __in __format_string LPCWSTR,
    ...);
#ifdef UNICODE
#define wsprintf wsprintfW
#else
#define wsprintf wsprintfA
#endif // !UNICODE

LPWSTR是格化後輸出的緩衝區。
LPCWSTR是輸入格式化字串。
...是可變參數。

調用這個函數的例子如下:
#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        CThread* pThread = reinterpret_cast<CThread *>(lpParameter);
#055        if (pThread)
#056        {
#057              //線程返回碼。
#058              //調用類的線程處理函數。
#059                return pThread->Run();
#060        }
#061       
#062        //
#063        return -1;       
#064  }
#065
#066  //線程運行函數。
#067  //在這裡可以使用類裡的成員,也可以讓衍生類別實現更強大的功能。
#068  //蔡軍生 2007/09/24
#069  virtual DWORD Run(void)
#070  {
#071        //輸出到調試視窗。
#072        ::OutputDebugString(_T("Run()線程函數運行/r/n"));
#073
#074        TCHAR chTemp[128];
#075        wsprintf(chTemp,_T("ThreadID=%d/r/n"),m_dwThreadID);
#076        ::OutputDebugString(chTemp);
#077
#078        return 0;
#079  }
#080
#081 protected:
#082  HANDLE m_hThread;        //線程控制代碼。
#083  DWORD m_dwThreadID;          //線程ID。
#084
#085 };
#086

在這個例子裡主要在第54行擷取類的指標,然後在59行調用運行類的成員函數Run()。通過這樣的調用後,所有線程的代碼都可以寫在類CThread裡面了,這樣就達到編寫更簡單的代碼和複用的目的,因此Run函數設計為虛函數,讓衍生類別可以改寫這個類的功能。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.