2014-10-05 38 views
2

下面有我的代碼的一部分:創建Thread類

class MyClass 
{ 
    ... 
    HANDLE m_ListenThr; 
    DWORD WINAPI ListenThread (LPVOID WorkContext); 
    bool CreateListenThreads(); 
} 

bool MyClass::CreateListenThreads() 
{ 
    ... 
    m_ListenThr = CreateThread(NULL, 0, MyClass::ListenThread,(void*)this, 0,&dwThreadId); 

} 

DWORD WINAPI MyClass::ListenThread (LPVOID WorkThreadContext) 
{ 

MyClass pThis = reinterpret_cast<MyClass*>(WorkThreadContext); 
... 
} 

編譯後,我得到這個錯誤:

error C3867: 'MyClass::ListenThread': function call missing argument list; use '&MyClass::ListenThread' to create a pointer to member

什麼,我做錯了什麼?

+2

您是否嘗試將'&MyClass :: ListenThread'作爲CreateThread的第三個參數? – imreal 2014-10-05 21:17:00

+0

@imreal是的,我做到了。下一個錯誤是'錯誤C2664:'CreateThread':無法將參數3從'DWORD(__stdcall MyClass :: *)(LPVOID)'轉換爲'LPTHREAD_START_ROUTINE'' – maciekm 2014-10-05 21:21:51

回答

2

你必須定義線程函數DWORD WINAPI ListenThread (LPVOID WorkContext);作爲類的static功能:

class MyClass 
{ 
public: 
    static DWORD WINAPI ListenThread (LPVOID WorkContext); 
} 

這是不可能調用一個成員函數沒有對象的實例。在你的情況下,this只是一個參數,將在您現在的靜態函數ListenThread中作爲WorkContext傳遞。


作爲另一種解決方案,您也可以考慮使用C++ 11 std::bind,以便創建一個函數對象,您將傳遞給CreateThread。

那會去這樣的事情 - 對不起,我沒有窗戶,以便檢查這種編譯 - 但它給你的想法:

bool MyClass::CreateListenThreads() 
{ 
    using std::placeholders; 
    std::function <void (void*)> threadFunction = std::bind(&MyClass::ListenThread, *this, _1); 
    m_ListenThr = CreateThread(NULL, 0, threadFunction,(void*)this, 0,&dwThreadId); 

} 

但會有點用的參考這個兩次:作爲調用函數的類的實例,並作爲參數LPVOID WorkContext。在目前的情況下可能會很尷尬。

+0

@Hayk Grig as Stephane Roland說我做了兩件事:在h文件我定義函數ListenThread爲靜態:'靜態DWORD WINAPI ListenThread(LPVOID WorkContext);'和實現部分'CreateThread(NULL,0,&MyClass :: ListenThread,(void *)this,0,&dwThreadId);' – maciekm 2015-03-06 00:38:11