taskSpawn能调用类的成员函数?

tayizhao   2007-11-1 17:32 楼主
比如
MySocket是一个Socket server的类,StartServer是他的成员函数
taskSpawn("StServer",120,0,2500,(FUNCPTR)(MySocket.StartServer),0,0,0,0,0,0,0,0,0,0)
貌似不能编译通过,显示错误
..\UTHandling_BS\ServerSocket\Server.cpp: In function `int main(...)':
..\UTHandling_BS\ServerSocket\Server.cpp:11: no matches converting function `StartServer'  
to type `int (*)(...)'
..\UTHandling_BS\ServerSocket\Server.h:74: candidates are: STATUS ALC_BS_Socket_C::StartSe
rver()

我的问题是:
1.是不是VxWorks新建任务提供的函数指针必须是编译时就能确定位置的?
2.有没有walk around?
谢谢先

回复评论 (9)

MySocket是实例吗?
还有成员函数是否是公用函数?


1.应该是,至少此对象或函数存在。

2。?请说明白
点赞  2007-11-2 19:36
定义为公共属性的静态成员函数就可以了
点赞  2007-11-5 11:40
2. 可以再封装一下试试,在task的function中调用实例的成员函数
点赞  2007-11-8 17:48
通用的方法是把类的静态成员注册为任务,参数中传递对象的地址,如:
class CTest
{
    static void Task(CTest *pObj);
    void RealTaskEntry(void);
};

taskSpawn( "Test", 120, 0, 2500, (FUNCPTR)(&CTest::Task), (int)[对象地址], 0, 0, 0, 0, 0, 0, 0, 0, 0)

void CTest::Task(CTest *pObj)
{
    pObj->RealTaskEntry();
}

成员函数也只是个函数而已,取其地址不能用对象,而是用[&CLASS::FUNCTION]。实际上在某些系统中用非静态
成员也可以,如在PPC上this一般是通过r3传递的,可以强制转换为普通函数,把对象做为参数给任务,但这样
并不通用。
点赞  2007-11-13 20:03
类的非静态成员函数在编译时没有实际地址,是偏移。建议参考c++对象模型,所以任务只能是
全局函数或者类的静态函数
点赞  2007-12-27 21:29
To solomon1:
只有虚函数在真正做虚函数调用时才没有实际地址,不信你反汇编了看。不能直接使用主要是有一个隐含的this 参数,不同编译器、不同CPU上传递的方式都不同。如PowerPC上一般是用r3,但如果返回值是数据结构则可能又变成r4。
点赞  2008-3-29 20:36
定义为类的静态成员函数!!!非静态成员函数this指针不好传进去
点赞  2008-4-29 22:14
有点难度哦
点赞  2008-5-1 08:49
接分是王道!
点赞  2008-5-1 11:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复