2014-06-06 157 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