我想在类中创建一个新线程。问题是当我需要将指针传递给将在新线程中使用的函数时。我无法传递指向该函数的指针。引擎盖下的阶级功能基本上是这样的吗?
void foo (this);
那为什么这段代码拒绝编译?
class TimeClass
{
private:
DWORD dwThreadId;
HANDLE hThread;
LPTHREAD_START_ROUTINE Timer ();
public:
TimeClass ();
};
TimeClass::TimeClass ()
{
dwThreadId = CreateThread (NULL, 0, Timer, this, 0, &dwThreadId);
}
答案 0 :(得分:3)
线程函数的签名必须是
DWORD WINAPI ThreadProc(LPVOID param);
普通(即非静态)C ++成员函数没有WINAPI调用约定,因此不能用作线程函数。如果将成员函数声明为static,则可以将其用作线程函数:
static DWORD WINAPI ThreadProc(LPVOID param);
答案 1 :(得分:2)
引擎盖下的班级功能基本上是这样的吗?
void foo(this);
一般来说,没有。这是编译器决定它的原因,并且可能存在各种“非虚拟thunks”,内联等。允许编译器以任何不改变程序行为的方式优化程序,等等标准未定义实现细节。这就是为什么你要做的就是UB,你最好的选择(恕我直言)就像是:
extern "C" wrapper(void * p)
{
static_cast<TimeClass*>(p)->whatever();
}
答案 2 :(得分:0)
ThreadProc()
原型是
DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
);
因此您需要更改Timer()
声明,如:
DWORD WINAPI Timer()