在类(窗口)中创建新线程

Create new thread in class (windows)

本文关键字:线程 新线程 窗口 在类 创建      更新时间:2023-10-16

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

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

线程函数的签名必须是

DWORD WINAPI ThreadProc(LPVOID param);

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

static DWORD WINAPI ThreadProc(LPVOID param);

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

虚空福(这个);

一般来说,没有。这是编译器决定的,可能有各种"非虚拟thunks",内联等。编译器可以以任何不改变程序行为的方式优化程序,并且此类实现细节未由标准定义。这就是为什么您要做的是UB,而您在这里的最佳选择(恕我直言)是这样的:

extern "C" wrapper(void * p)
{
    static_cast<TimeClass*>(p)->whatever();
}

ThreadProc()原型是

DWORD WINAPI ThreadProc(
  _In_  LPVOID lpParameter
);

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

DWORD WINAPI Timer()