在我的应用程序中,我使用了一个生成自己的线程的非 Qt 类。此对象在设备上侦听并在设备每次收到数据包时调用回调。
在我的设备类(从 QObject 派生)中,我有一个静态函数,它接收回调,然后应该调用实际对象的成员函数。
//super sample code
Device::Device(QObject *parent) : QObject(parent)
{
}
void Device::startCapture(pcpp::PcapLiveDevice *dev)
{
// open the device before start capturing/sending packets
if (!dev->open())
{
return;
}
dev->startCapture(callback, this);
}
//this is a static function
void Device::callback(pcpp::RawPacket *packet, pcpp::PcapLiveDevice *dev, void *cookie)
{
pcpp::Packet* parsed = new Packet(packet,true);
QMetaObject::invokeMethod(static_cast<Device*>(cookie), "processPacket", Qt::QueuedConnection, Q_ARG(pcpp::Packet*, parsed));
}
void Device::processPacket(pcpp::Packet *packet)
{
//do something in its living QThread
}
Device 对象有自己的 QThread,因为我正在后台进行大量分析。如果可能的话,主线程不应该参与。问题是维基状态(https://doc.qt.io/qt-5/qmetaobject.html#invokeMethod)
“如果类型是 Qt::QueuedConnection,一旦应用程序进入主事件循环,就会发送一个 QEvent 并调用该成员。”
这听起来像是主线程至少需要处理每个数据包才能将其转发到 Device 对象所在的线程。
难道没有一个选项可以在不使用主线程的情况下调用当前对象所在的 QThread 中的函数吗?
(QThread 肯定有自己的 EventLoop)