下面是我的代码的一部分:
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
我做错了什么?
最佳答案
您必须将线程函数DWORD WINAPI ListenThread (LPVOID WorkContext);
定义为该类的静态
函数:
class MyClass
{
public:
static DWORD WINAPI ListenThread (LPVOID WorkContext);
}
没有对象实例就不可能调用成员函数。在您的情况下,this
只是一个参数,将在您现在的静态函数 ListenThread
中作为 WorkContext
传递。
作为另一种解决方案,您还可以考虑使用 C++11 std::bind 来创建一个函数对象,并将其传递给 CreateThread。
那会是这样的 - 抱歉,我没有 Windows 来检查它是否可以编译 - 但它给了你这个想法:
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);
}
但这会两次使用对 this 的引用:作为调用函数的类的实例,以及作为参数 LPVOID WorkContext。也许在目前的情况下这很尴尬。
关于c++ - 在类中创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26207299/