比如
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?
谢谢先
MySocket是实例吗?
还有成员函数是否是公用函数?
1.应该是,至少此对象或函数存在。
2。?请说明白
2. 可以再封装一下试试,在task的function中调用实例的成员函数
通用的方法是把类的静态成员注册为任务,参数中传递对象的地址,如:
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传递的,可以强制转换为普通函数,把对象做为参数给任务,但这样
并不通用。
类的非静态成员函数在编译时没有实际地址,是偏移。建议参考c++对象模型,所以任务只能是
全局函数或者类的静态函数
To solomon1:
只有虚函数在真正做虚函数调用时才没有实际地址,不信你反汇编了看。不能直接使用主要是有一个隐含的this 参数,不同编译器、不同CPU上传递的方式都不同。如PowerPC上一般是用r3,但如果返回值是数据结构则可能又变成r4。
定义为类的静态成员函数!!!非静态成员函数this指针不好传进去