【发布时间】:2013-07-24 18:45:46
【问题描述】:
我有一个 QCoreApplication,它在启动期间加载不同的 QtPlugins,这些插件从各种来源获取数据。此数据通过注册的回调函数(每个插件相等)推送回我的 QCoreApplication。回调注册如下:
// m_manager is a class variable of the class registering the callback...
pluginInterface->registerCallback(std::bind(&Manager::handleData, std::ref(m_manager), _1));
现在我遇到以下问题: 在其中一个插件中,第三方库通过网络接收数据。数据将与包含指向插件类的 this 指针的自定义结构一起推送到我的插件类的静态成员函数。当我在插件中接收数据时,我现在想通过注册的回调将其推送到我的 QCoreApplication 。此外,我想在回调函数中创建新对象(如 QTimer)。但是,当通过插件类的 this 指针从静态成员函数调用回调函数时,似乎没有运行事件循环。在查看创建的 QTimer 对象的成员时,它的 QAbstractEventDispatcher 指针为 0。因此,QTimer 对象不能发出任何信号,这是我迫切需要的。
我认为通过插件类的 this 指针调用回调函数(QEventLoop 肯定正在运行,因为我可以使用插件内部的信号/插槽以及从插件的其他非静态成员函数到我的 QCoreApplication没有问题)。不过,好像我错了。有人对所描述的行为有解释吗? 如果需要任何其他详细信息,请询问,我会尽力提供。
问候, 罗伯特
【问题讨论】:
-
请展示您如何使用第三方库执行网络请求。更具体地说,这个库是异步的吗?为什么不使用 Qt 网络模块呢?
-
调用app.exec()后是否加载插件?旁注:只要连接是直接的(默认),信号/插槽就不需要事件循环。它们只是同步函数调用。只有排队的连接需要事件循环。
-
@FrankOsterfeld 是的,插件是在调用 app.exec() 之后加载的。
-
@FrankOsterfeld 在尝试创建和启动 QTimer 时,我收到此警告“qtimer 只能用于以 qthread 启动的线程”,并且 QTimer 永远不会发出超时信号。加载的插件和 Manager 类都在单独的线程中运行。线程基本上都是创建和启动的,如QThread 所示。 Manager 中新创建的计时器将在插件线程的上下文中运行,但正如我所说的没有有效循环
-
@Riateche 我自己没有直接进行网络请求。这深埋在第三方库中。我只调用了 lib 提供的一个函数,该函数完成了所有繁重的工作并回调了我的类的静态成员函数(static void receiveData(void* data, void* callbackData)。在 callbackData 我存储例如这个指针。该库是同步的。我不使用 Qt 网络库的原因是为了解释,“接收一些数据”被过度简化了。该库正在做大量我不想要的专门工作手动操作
标签: qt qeventloop