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

  接着上面再继续实现更加强大线程类从上面C++类里可以看到要在静态里使用类成员就需要获取this指针也就是通过CreateThread里把类this指针传送进来这样在ThreadProc里参数lpParameter就是this指针了因此把参数lpParameter转换为CThread类指针这样就可以使用类成员在这个例子里使用wsprf来格式化线程ID输出来下面就来详细地分析例子吧

  wsprf声明如下:

WINUSERAPI

WINAPIV
wsprfA(
    __out LPSTR,
    __in __format_ LPCSTR,
    ...);
WINUSERAPI

WINAPIV
wsprfW(
    __out LPWSTR,
    __in __format_ LPCWSTR,
    ...);
#def UNICODE
# wsprf wsprfW
#
# wsprf wsprfA
#end // !UNICODE


  LPWSTR是格化后输出缓冲区

  LPCWSTR是输入格式化

  ...是可变参数

  这个例子如下:

#001 #pragma once
#002 
#003 //线程类
#004 //蔡军生 2007/09/23
#005  CThread
#006 {
#007 public:
#008 
#009  CThread(void)
#010  {
#011          m_hThread = NULL;
#012  }
#013 
#014  virtual ~CThread(void)
#015  {
#016          (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          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   DWORD WINAPI ThreadProc(LPVOID lpParameter)
#052  {
#053         //转换传送入来参数
#054         CThread* pThread = reerpret_cast<CThread *>(lpParameter);
#055          (pThread)
#056         {
#057               //线程返回码
#058               //线程处理
#059                 pThread->Run;
#060         }
#061         
#062         //
#063          -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        wsprf(chTemp,_T("ThreadID=%d\r\n"),m_dwThreadID);
#076         ::OutputDebugString(chTemp);
#077 
#078          0;
#079  }
#080 
#081 protected:
#082  HANDLE m_hThread;         //线程句柄
#083  DWORD m_dwThreadID;          //线程ID
#084 
#085 };
#086 


  在这个例子里主要在第54行获取类指针然后在59行运行类成员Run通过这样所有线程代码都可以写在类CThread里面了这样就达到编写更简单代码和复用因此Run设计为虚让派生类可以改写这个类功能



Tags:  wsprintfsprintf wsprintf windowsapi函数库 windowsapi函数

延伸阅读

最新评论

发表评论