gpt4 book ai didi

c++ - 创建线程不接受成员函数

转载 作者:可可西里 更新时间:2023-11-01 09:39:32 24 4
gpt4 key购买 nike

我正在尝试为网络编程创建一个类。这将创建一个带线程的通用套接字。

但是当我尝试使用 createthread() 创建线程时。第三个参数是产生错误。从网上我了解到我不能使用成员函数作为 createthread() 的参数。

有什么可以实现的吗?

最佳答案

处理这个问题的最简单方法是创建一个“ stub ”函数,它会回调到您的类中。

UINT tid
HANDLE hThread = CreateThread(NULL, 0, myThreadStub, this, 0, &tid);

....

unsigned long WINAPI myThreadStub(void *ptr)
{
if (!ptr) return -1;
return ((MyClass*)ptr)->ThreadMain();
}

CreateThread() 允许您将参数传递给线程函数(CreateThread() 调用的参数 4)。您可以使用它来将指针传递给您的类。然后,您可以让线程 stub 将该指针转换回正确的类型,然后调用成员函数。你甚至可以让“myThreadStub”成为“MyClass”的静态成员,允许它访问私有(private)成员和数据。

如果您安装了 boost,您可以使用 boost::bind 来执行此操作而无需创建 stub 函数。我从来没有在 Windows 上尝试过,所以我不能肯定它会起作用(因为回调函数必须是 WINAPI 调用)但如果它确实起作用,它看起来像这样:

HANDLE hThread = CreateThread(NULL, 0, boost::bind(&MyClass::ThreadFunction, this), NULL, 0, &tid);

其中线程函数是一个非静态成员函数,它接受一个 void * 参数。

关于c++ - 创建线程不接受成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2891926/

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