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函數設計為虛函數,讓衍生類別可以改寫這個類的功能。