1

我想在一个类中创建一个新线程。问题是当我需要将指针传递给将在新线程中使用的函数时。我无法将指针传递给函数。引擎盖下的类函数基本上是这样的吗?

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);
}
4

3 回答 3

2

线程函数的签名必须是

DWORD WINAPI ThreadProc(LPVOID param);

普通(即非静态)C++ 成员函数没有 WINAPI 调用约定,因此不能用作线程函数。如果将成员函数声明为静态,则它可以用作线程函数:

static DWORD WINAPI ThreadProc(LPVOID param);
于 2013-10-06T13:18:36.803 回答
1

引擎盖下的类函数基本上是这样的吗?

无效的富(这个);

一般来说,没有。这是编译器决定的,并且可能存在各种“非虚拟 thunk”、内联等。允许编译器以不改变程序行为的任何方式优化程序,等等标准没有定义实现细节。这就是为什么您要尝试做的是UB,而您最好的选择(恕我直言)是这样的:

extern "C" wrapper(void * p)
{
    static_cast<TimeClass*>(p)->whatever();
}
于 2013-10-06T08:39:53.693 回答
0

ThreadProc()原型是

DWORD WINAPI ThreadProc(
  _In_  LPVOID lpParameter
);

因此,您需要更改Timer()声明,例如:

DWORD WINAPI Timer()
于 2013-10-06T08:39:23.567 回答