我有一个带有cThread类的C ++ API,以及这个创建线程的方法:
void cThread::start(void(*a_function)(void), CThreadPriority a_level);
我已经完成了一个类和一个init()方法来启动一个线程和一个由线程执行的updateHaptics()方法:
void EntryClass::init()
{
typedef void (EntryClass::*method)();
method p;
p = &EntryClass::updateHaptics;
// create a thread which starts the main haptics rendering loop
cThread* hapticsThread = new cThread();
hapticsThread->start(p, CTHREAD_PRIORITY_HAPTICS);
}
void EntryClass::updateHaptics(void)
{
// ...
}
我的问题是将updateHaptics()方法作为参数传递给cThread :: start()方法。
我有这个错误:
1>EntryClass.cpp(55): error C2664: 'void chai3d::cThread::start(void (__cdecl *)(void *),const chai3d::CThreadPriority,void *)' : impossible de convertir l'argument 1 de 'method' en 'void (__cdecl *)(void)'
REM:我在Windows 8 / Visual Studio
下答案 0 :(得分:0)
据我所知,我们只能使用静态函数作为线程proc。是的,我们也可以传递类静态函数。
答案 1 :(得分:0)
您指定的签名
void(*a_function)(void)
用于函数,不用于类方法。静态方法也可以使用
请注意与您使用的typedef的区别:
void (EntryClass::*method)();
定义可以是:
class EntryClass {
public:
void init();
static void updateHaptics(); // <--- NOTE the static
};
和您的实施
void EntryClass::init()
{
typedef void (*method)(); // <---- NOTE THIS CHANGE
method p;
p = &EntryClass::updateHaptics;
// create a thread which starts the main haptics rendering loop
cThread* hapticsThread = new cThread();
hapticsThread->start(p, CTHREAD_PRIORITY_HAPTICS);
}
void EntryClass::updateHaptics(void)
{
// ...
}