MFC 友元线程函数方式总结

多线程程序的线程函数需要使用类的成员变量和成员函数时,通常通过定义线程函数为类的友元函数,然后才能像类自己的成员函数一样访问其成员变量和成员函数。这种方式非常的方便尤其相对于通过定义静态全局线程函数和定义类的静态成员线程函数的方法有很大的优点,它能够访问类所有的成员变量和成员函数。

这里有几点需要注意的是:

1.定义线程函数时,除了需要在类的里边声明为友元函数,也要在该声明头文件顶部再次声明该线程函数,同时具体地定义该线程函数时也要将其放置在定义类文件的顶部,也就是说除了将其定义为类的友元函数这一点有些特别之外实际上也是将其作为一个全局函数来对待的。

2.在使用MFC线程类的AfxBeginThread创建线程函数调用并非类的线程函数时,需要对其进行(AFX_THREADPROC)类型强制转换,不然会出现错误如下:

error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'void (__cdecl *)(void *)'。这一点非常重要。

3.  线程函数之中调用类的成员变量和成员函数是通过创建线程时传入该类对象的this指针来引用的。在线程函数中获得该类对象的指针然后取得对应的成员变量和成员函数。

4.  另外在VC下调试时要注意其运行库必须设置为多线程并注意参数传入顺序。

下面给出一个示范例子:

ClassADlg.h     //类头文件

 

void threadProc(LPVOID lpv);

///

class ClassADlg: public CDialog

{

Public:

friend void threadProc(LPVOID lpv);

}

 

ClassADlg.cpp     //类实现文件

Include” ClassADlg.h”

void threadProc(LPVOID lpv)

{

   ClassADlg * pMain = (ClassADlg *) lpv; //强制转换获得传入的类对象指针

   int a= pMain->ax;  //获得传入的类对象的成员变量

   pMain->add(a);   //调用传入的类对象的成员函数

}

/

Void test(void)

{

CWinThread* cWth1=AfxBeginThread((AFX_THREADPROC) threadProc,(LPVOID)this);  //创建线程

转载于:https://www.cnblogs.com/WadeXU/archive/2012/12/20/2826372.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值