首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

类里封装的线程函数一定要是惊叹函数吗解决方法

2012-01-30 
类里封装的线程函数一定要是惊叹函数吗想要在类里面用afxBeginThread()创建一个工作子线程, 并且线程函数

类里封装的线程函数一定要是惊叹函数吗
想要在类里面用afxBeginThread()创建一个工作子线程, 并且线程函数封装在这个类里面(也就是说该线程函数不是全局函数)。 这个线程函数一定要是静态函数吗? 我过去看到的例子都是把这个函数写成static的, 不知道是不是出于一定的原因, 希望大虾予以指点。 


[解决办法]
只能是全局或静态的
[解决办法]
因为AfxBeginThread需要一个函数指针,而这个函数的原型是已经定死了的——
就是说,这个函数的参数、返回值等等形式都必须符合约定。

系统将按照这样的约定调用你给的函数,如果你用了一个不同形式的函数,然后用
强制类型转换(以避开编译错误),把它的指针传进去,那么将导致调用这个函数
的时候(或者从函数返回的时候)程序崩溃。

通常在需要回调函数的时候,都使用全局/静态函数。这是因为成员函数的内部实现
形式依赖于所属的类。一个类是否带有虚函数、是否多继承或虚继承等因素都会影
响其函数指针的表现及调用形式(要理解这种区分,你可能需要一点汇编语言或者
编译器的知识,或者看看《深度探索C++对象模型》)。要想对应这种不同类型的成
员函数指针,模板技术还有可能,AfxBeginThread这种已经编译好的函数就不行
了,全局/静态函数就没有这种担心。

通常我都会定义一个静态成员函数,而把类的this指针作为附加参数传进去,而这
个静态函数只是作为一个接口,它直接以传入的附加参数(先强制转换,恢复成本
类的对象指针)调用另外一个真正要用的成员函数。基本上,都是这样用的。

热点排行