文章分类

站点统计

  • 分类总数: 13 个
  • 文章总数: 145 篇
  • 评论总数: 47 条
  • 附件总数: 59 个
  • 建站日期: 2008-08-18
  • 访问总数: 472873 人次
  • RSS订阅: 文章|评论

VC++中关于线程访问类成员的问题

Admin 于 2008-08-30 02:07:13 发表C/C++

订阅: http://www.kaiyuan8.org/Feed/Article_13.aspx
引用: 点这里获取地址 (UTF-8)
ASP.NET MVC Codeplex Preview 5发布了 < VC++中关于线程访问类成员的问题 > JavaScript模板引擎

   用线程函数调用类的成员函数时,需要将线程函数声明为类的static成员。由于线程函数是一个由系统调用的函数,所以是一个callback函数,所以他不能有this指针,所以你的线程函数要么是全局函数,要么是类的静态成员。

将线程函数申明为静态,如:

  1. class CRealtimeTask 
  2.     public
  3.     static UINT taskmain(LPVOID param); 
  4.     BOOL StartTask(); 
  5. }; 

但是这样存在着缺陷,也有好处,好处是能够在调用函数时用param传入this指针,然后在线程函数中用类型转换转换成指向该类的指针,这时该指针就能够访问非静态变量和私有变量了并且可以将线程函数配置为 private,就能够完全隐藏,配置为protected,能够被子类调用或定制。

还有一种好的解决办法:将线程函数申明成友员函数,这样能够传入该类的指针,访问类的成员:

  1. class CRealtimeTask 
  2.     public
  3.     friend UINT taskmain(LPVOID param); 
  4.     BOOL StartTask(); 
  5. }; 
  6.  
  7. UINT taskmain(LPVOID param) 
  8.     CRealtimeTask * pTaskMain = (CRealtimeTask *) param; 
  9.     //通过pTaskMain指针引用。 
  10.     return TRUE; 
  11.  
  12. BOOL CRealtimeTask::StartTask() 
  13.     AfxBeginThread(taskmain,this); 

下面一段代码是网上的牛人写的为了实现线程函数访问类成员而实现的类。作者说比MFC的实现方法好象要好一点,还没考证,呵呵:

  1. typedef int (base::*fnCallBack)(void *p); 
  2. struct callback{void *param;fnCallBack *pfuc;base *pThis;}; 
  3.  
  4. class base 
  5.     static int myThreadfuc(void *p) 
  6.     { 
  7.         struct callback *p1=(struct callback *)p; 
  8.         base *pthis=p1->base;fnCallBack *pfuc=p1->pfuc;void *param=p1->param; 
  9.         int i=(pthis->*pfuc)(param);delete p; 
  10.         return i; 
  11.     } 
  12.     public
  13.     void myCreateThread(fnCallBack pfuc,void *param){ 
  14.         struct callback *p=new struct callback; 
  15.         p.param=param;p.pThis=this;p.pfuc=pfuc; 
  16.         ::CreateThread(myThreadfuc,p); 
  17.     } 
  18.     virtual int myCallBack(void *p){printf("It's base class.\n");return 0;} 
  19. }; 
  20. class derived:public base 
  21.     int myCallBack(void *p){printf("It's derived class\n");} 
  22. }; 
  23. void myCreateThreadImitate(fnCallBack fuc,void *p) 
  24.     (*fuc)(p); 
  25. void main() 
  26.     base p;char *param; 
  27.     p.myCreateThread(&(base::myCallBack),param); 
  28.     derived p2;p2.myCreateThread(&(base::myCallBack),param); 
  29. }  

 

被阅965次, 1投一票
  • 看完了要说点啥么?
  • 昵称 (不填说不了话)
  • 信箱地址 (不会被公开,但是不填也说不了话)
  • 网址 (这个不填也成)
Powered by MiniBoke v2.0.0.8 Build 0828

Copyright © 2008 开源吧!. All rights reserved.

粤ICP备07500939号