求厦门旅游 请高人指点点,beginthread函数怎么调用类内成员函数

C/C++(108)

用AfxBeginThread启动线程,线程的执行函数有两种定义的方法:
&!--[if !supportLists]--&1.&&&&& &!--[endif]--&全局函数:UINT threadMessageBoxAdapter( LPVOID lParam );
&!--[if !supportLists]--&2.&&&&& &!--[endif]--&静态成员函数:static UINT threadMessageBoxAdapter( LPVOID lParam );
我们一般的经验是,在线程中使用变量都必须是全局变量,成员变量定义成static,才能在线程函数中访问成员变量。
这里说明一种在线程函数中访问成员变量的方法:
这里定义Thread类:
class Thread
&&&&&&&&&&&&& static UINT threadMessageBoxAdapter( LPVOID lParam );
&&&&&&&&&&&&& UINT threadMessageBoxProc( );
&&&&&&&&&&&&& CString strThreadT
线程函数的实现:
UINT Thread::threadMessageBoxAdapter( LPVOID lParam )
&&&&&&&&&&&&& CTestVectorDlg* obj = ( CTestVectorDlg* )lP
&&&&&&&&&&&&& return obj-&threadMessageBoxProc();
UINT Thread::threadMessageBoxProc()
&&&&&&&&&&&&& CString strThreadT
&&&&&&&&&&&&& strThreadText.Format( _T( &%s& ), _T( &Thread adapter& ) );
&&&&&&&&&&&&& AfxMessageBox( strThreadText );
&&&&&&&&&&&&& return 0;
使用AfxBeginThread启动线程:
&&&&&&&&&&&&& CWinThread*
&&&&&&&&&&&&& thread = AfxBeginThread( threadMessageBoxAdapter, this );
这样,当线程启动后,弹出”Thread Adapter”的信息,说明成功访问成员变量
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:206925次
积分:4022
积分:4022
排名:第6410名
原创:127篇
转载:469篇
评论:91条
(3)(2)(144)(269)(143)(45)(1)(1)2001年7月 VC/MFC大版内专家分月排行榜第一
2001年6月 VC/MFC大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。技术(12)
遇到的问题
&&&&&&&& 我们在编程中需要把数据封装成一个类,调用pthread_create 利用成员函数去创建一个线程往往是不成功的!
error: argumentof type ‘void* (Threadpool::)(void*)’ does not match ‘void* (*)(void*)’
出现类型不匹配的问题。因为pthread_create需要的参数类型为void*(*)(void*),而thread_rounter作为类的成员函数时其类型是void* (Threadpool::)(void*)的成员函数指针。我们知道类的成员函数在经过编译器处理之后,会变成带有this指针参数的全局函数,所以类型注定是不会匹配的。
&&&&&&&& 天无绝人之路,尤其是对于C++这种被称为Wenger巨人刀(/articles/6639.html#more-6639)的超级语言一定会有各种奇淫技巧提供出超乎想象的解决方案的。
各种编程语言的调侃图
声明static 成员函数作为线程函数
但是如果将thread_rounter声明为static类型,那么编译器会将static形式的函数,转换成不带this指针的全局函数,所以其类型可以与pthread_create需要的参数类型相匹配。但是类的静态成员函数无法访问类的非静态成员,不过这可以通过传递this指针解决这个问题。
staticvoid*threadfun(void*)
&&&&&&&& //dosomething
通过全局函数回调成员函数
void *thread (void *tmp)/线程执行函数
& ClassName*p=( ClassName *)
&&&//通过p指针间接访问类的非静态成员
终极解决方案C++模板
以下摘自()
//声明定义一个模板函数
template &typename TYPE, void(TYPE::*_RunThread)() &
void* _thread_t(void* param)
&&&TYPE* This = (TYPE*)
&&&This-&_RunThread();
&&&return NULL;
&&&&&&&& _thread_t:为模板函数名,可随意起
&&&&&&&& TYPE:类名
_ RunThread:为TYPE类中成员函数的名称,在这里必须是pbulic 。不可以任意取名。返回类型和参数必须和类中的一致。
class MyClass
&&&MyClass();
&&&void _RunThread();
&&&pthread_
void MyClass::_RunThread()
&&&this-&DoSomeThing();
MyClass::MyClass()
&&&&&&&& //利用C++强大的模板功能巧妙滴实现了函数转换
&&&pthread_create(&tid, NULL, _thread_t&MyClass,&MyClass::_RunThread&, this);
&&&& 函数模版不单可以替换类型本身,还能替换类型的成员函数。
注意:1、名称只能是_RunThread,不能在指定模版参数的时候修改;
&&&&&2、_RunThread只能是public的,除非把_thread_t定义到MyClass的内部。
&&&&&&&& 这些奇淫技巧没有必要记住,用的时候能想起来查的到即可。以上说做的工作就只有一个目的,把函数类型转换成 void*(*)(void*)类型的。同理可以把这种技巧移植到其他的需要的地方,比如可以把成员函数转换成 T(*)(T*)的函数,这里就不一一解释了。
&&&&&&&& 如果读者看到这里没有明白以上所说的是什么意思或者有点晕,没有关系,照猫画虎用就可以了。建议读者从新阅读C++教
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10535次
排名:千里之外
原创:14篇
评论:19条
(1)(1)(2)(1)(1)(3)(1)(1)(1)(1)(1)

我要回帖

更多关于 形容高人指点的成语 的文章

 

随机推荐