2010-06-27 61 views
0

一位朋友給我發了他的線程課。 現在我只想運行一個偵聽器,但線程不希望接受該函數。 我想執行該功能(在static class Networks中定義)THREAD listen(void* args)THREAD#define THREAD unsigned __stdcall函數不想接受我的觀點?

Networks::init() { 
    listenerth = thread(); 
    listenerth.run(listen, NULL, "listener"); 
} 

class thread他定義爲runvoid run(THREAD func(void*), void* args, const char* pname);

我怎樣才能像跑聽在另一個線程要麼?

錯誤消息: main.cpp(19):error C3867:'Networks :: listen':函數調用缺少參數列表;使用「&網絡::聽」創建一個指向成員

但是當我將鼠標移動到錯誤的地方(符號聽),它讓我這個在工具提示(當然,MS VC++):

unsigned int __stdcall Networks::listen(void* data)

Error: argument of type "unsigned int (__stdcall Networks::*)(void *data)" is incompatible with parameter of type "unsigned int (__stdcall )(void)"

+5

你也應該發佈編譯器給你的確切的錯誤信息。 – Axarydax 2010-06-27 07:30:05

+0

[這個答案]的第一個代碼示例(http://stackoverflow.com/questions/3108631/how-to-pass-a-pointer-to-a-member-function-to-ac-function/3108745# 3108745)的幫助? – sbi 2010-06-27 08:04:31

+1

[使用C++類成員函數作爲C回調函數]可能的重複(http://stackoverflow.com/questions/1000663/using-ac-class-member-function-as-ac-callback-function) – 2010-06-27 08:41:14

回答

2

正如別人所說,你不能在這裏使用非靜態成員函數,因爲它期望一個正常的函數指針。如果您需要調用一個非靜態成員(因爲它需要在類訪問狀態),那麼你可以使用args參數通過一個靜態的「蹦牀」來稱呼它的功能,這樣的事情:

unsigned listen() {/* do the interesting stuff */} 

static THREAD call_listen(void* me) 
{ 
    return static_cast<Networks*>(me)->listen(); 
} 

void init() 
{ 
    listener = thread(); 
    listener.run(call_listen, this, "listener"); 
} 
2

listenerth的成員功能?如果是,那麼它不適用於run(..)

成員函數與在類之外聲明的函數不同。它們不能用於普通的函數指針。

+1

Member函數可以被使用,但是它們應該被聲明爲靜態的。 – Patrick 2010-06-27 09:13:05

+0

Aww,我只是忘了靜態... 感謝:D – aPoC 2010-06-27 10:01:41