gpt4 book ai didi

c++ - 如何在成员函数线程中调用回调?

转载 作者:行者123 更新时间:2023-11-27 23:14:21 25 4
gpt4 key购买 nike

我正在为 RS232 端口编写小类。它可以同步写入和异步读取。因此,对于异步读取,我使用第二个线程,等待输入数据。收到数据后,我想用输入数据调用用户回调(作为构造函数参数获得)。它看起来像:

typedef int (*ReceivedCallback)(string data);

class RS232
{
RS232(string portName, ReceivedCallback dataReceived);
~RS232();

private:
ReceivedCallback dataReceivedCallback;

private:
static unsigned ReaderThread(void* data);

public:
SendData(string data);
}

我的问题是:ReaderThread 必须是静态的才能将指向它的指针传递给 _beginthreadex() 函数。在 ReaderThread 中,我想调用在构造函数中从用户那里获得的“dataReceivedCallback”。但我不能,因为我不能在静态 ReaderThread 中调用非静态函数。此外,我不能将“dataReceivedCallback”设置为静态,因为我可能有很多我的类的实例(对于 COM1、COM2、COM3),每个实例都应该有自己的回调,由用户获取。

我的架构错误在哪里?您将如何实现?

提前致谢!

附言使用 Visual Studio 2005。

最佳答案

您需要将指向 RS232 实例的指针传递给 ReaderThread,后者又会将该指针传递给 static 回调,或直接调用 RS232 对象上的非 static 方法。

我还会使用 [CreateThread][1] 而不是 beginthreadex。我的代码示例将使用 CreateThread,但如果需要,您可以将该技术应用于 beginthreadex

简单地说,当启动 ReaderThread 时,将一个指向实例的指针传递给它:

RS232* myObj = new RS232;
CreateThread (..., myObj);

...使用reinterpret_cast 将其转换回去:

unsigned RS232::ReaderThread (void* data)
{
RS232* that = reinterpret_cast <RS232*> (data);
}

更改回调函数,使其也可以传递实例:

typedef int (*ReceivedCallback)(string data, RS232* that);

现在在回调中你可以调用成员函数:

that->DoSomethingCool (data);

关于c++ - 如何在成员函数线程中调用回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17594065/

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