2014-06-06 160 views
1

我有一个cThread类C++ API,并且此方法来创建一个线程:C++指针的函数作为参数

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 ::开始()方法。

我得到这个错误:

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中

+1

updateHaptics必须一个函数或一个静态方法。 – jsantander

+0

不幸的是,该API基本上被打破了,因为没有办法将任何数据传递给线程,因此也没办法提供一个类对象来调用成员函数。我会切换到标准的线程库(或者Boost,如果你被一个古老的编译器困住了)。 –

+0

这是因为,成员类的函数名称是由类的名称装饰的。静态功能没有装饰。 – LukeCodeBaker

回答

0

签名您表示

void(*a_function)(void) 

是一个函数,而不是一类方法。静态方法也可以工作

注意与你使用的类型定义的区别:

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) 
{ 
    // ... 
} 
+0

它的作品发现。谢谢 ! –

+0

Hi @ user3714840如果这个或任何答案已经解决了您的问题,请点击复选标记考虑[接受它](http://meta.stackexchange.com/q/5234/179419)。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 – jsantander

0

下,据我所知,我们只能使用静态函数作为线程PROC。是的,我们也可以传递类静态函数。

+0

这可能应该是一个评论而不是答案。 – moooeeeep