MFC 友元线程函数方式总结
2012-12-20 14:18
78 查看
本文转自:http://blog.sina.com.cn/s/blog_76dc2bb90100tqdv.html
多线程程序的线程函数需要使用类的成员变量和成员函数时,通常通过定义线程函数为类的友元函数,然后才能像类自己的成员函数一样访问其成员变量和成员函数。这种方式非常的方便尤其相对于通过定义静态全局线程函数和定义类的静态成员线程函数的方法有很大的优点,它能够访问类所有的成员变量和成员函数。
这里有几点需要注意的是:
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); //创建线程
多线程程序的线程函数需要使用类的成员变量和成员函数时,通常通过定义线程函数为类的友元函数,然后才能像类自己的成员函数一样访问其成员变量和成员函数。这种方式非常的方便尤其相对于通过定义静态全局线程函数和定义类的静态成员线程函数的方法有很大的优点,它能够访问类所有的成员变量和成员函数。
这里有几点需要注意的是:
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); //创建线程
相关文章推荐
- 多线程程序的友元线程函数方式总结
- 04.多线程--06.【同步方式在线程两种创建方式中的可行性】【同步代码块和同步函数的关系】【多线程程序设计思路总结】
- 进程线程中睡眠函数(sleep)被信号中断后失效,处理方式总结
- Linux的进程/线程间通信方式总结
- java基础<线程>总结(线程概念、线程创建方式、线程间通信、线程重要方法)
- 总结几种创建线程的方式
- Linux 线程操作函数总结
- MFC 主界面函数中线程等待避免界面卡死的处理方法
- Linux的进程/线程间通信方式总结
- Linux 线程操作函数总结
- Linux 线程属性函数总结
- boost::thread线程创建方式总结
- Linux 线程属性函数总结
- 经常遇到的一个问题是 MFC中开启多线程后 在非主线程中使用updata函数出现崩溃的情况。
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- Linux的进程/线程间通信方式总结
- 线程的状态和相应函数的总结
- C和C++中函数传参常见方式总结
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用) .
- C++ 函数调用方式(_stdcall, _pascal, _cdecl...)总结