- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 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/
我是一名优秀的程序员,十分优秀!