2014-10-05 73 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