gpt4 book ai didi

c++ - 在c++中运行类成员函数的线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:27 24 4
gpt4 key购买 nike

正如标题所说。以下是我的代码框架。

class CLASS
{
public:
void A();
private:
DWORD WINAPI B(LPVOID);
};

void CLASS::A()
{
DWORD (WINAPI CLASS::*thread)(LPVOID) = &CLASS::B;
...
CreateThread(NULL, 0, thread, &arg, 0, NULL);
...
}

函数B需要CLASS的成员变量。
但是当我编译这个时我得到了一个错误代码。
它是“无法将参数 3 从‘DWORD (__stdcall CLASS::*)(LPVOID)’转换为‘LPTHREAD_START_ROUTINE’”或类似的东西。
不知道在英文环境下是不是一样。

有人可以帮忙吗?

最佳答案

说真的,使用std::thread:

class CLASS
{
public:
void A();
private:
void B(your args go here);
};

void CLASS::A()
{
std::thread t(&CLASS::B, this, your args go here);
// when done
t.join();
// or
t.detach();
}

说明

您的代码无法编译,因为 CreateThread 是一个 C API,需要一个非成员 C 函数作为回调。为了调用 C++ 类的非静态成员函数,调用者需要了解 this 指针以及如何正确使用它。由于 WinAPI 显然没有 this 并且不期望成员函数指针,因此这不可能工作。您的编译器会捕获此错误并将其报告为类型不匹配错误。

这就是 CreateThreadlpParameter 发挥作用的地方。它允许您通过该参数传递 this。然而,这并没有改变 CreateThread 不知道如何调用 C++ 成员函数的事实。因此,您有责任将其包装在将执行成员函数调用的静态函数中:

class CLASS
{
public:
void A();
private:
DWORD B();
static DWORD s_B(LPVOID);
};

DWORD CLASS::s_B(LPVOID that) {
return ((CLASS*)that)->B();
}

void CLASS::A() {
CreateThread(NULL, 0, s_B, this, 0, NULL);
}

这就是@Nawaz 在他们的回答中所做的,除了以一种稍微更一般的方式。

尽管这种方法有效,但它显然有缺点:

  • 很冗长。
  • 不可携带。
  • 您需要通过不同的方式(例如通过类(class)成员)传递您的原始args

std::thread 已经为您做了所有这些。

关于c++ - 在c++中运行类成员函数的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4666635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com