Windows API一日一练(44)wsprintf函数

Post date: 2012/3/27 上午 07:33:16

分类: Direct3D2007-09-24 21:39 4818人阅读 评论(6) 收藏 举报

接着上面,再继续实现更加强大的线程类。从上面的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函数设计为虚函数,让派生类可以改写这个类的功能。