在类中创建新线程(windows)

时间:2013-10-06 08:24:24

标签: c++ windows multithreading winapi

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

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

3 个答案:

答案 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()