Qt 通过此指针从静态函数调用QEventLoop时是否未运行?

Qt 通过此指针从静态函数调用QEventLoop时是否未运行?,qt,qeventloop,Qt,Qeventloop,我有一个QCore应用程序,它在启动期间加载不同的插件,这些插件从不同的来源获取数据。这些数据通过一个注册的回调函数(每个插件相等)推回到我的QCoreApplication。回调的注册方式如下: // m_manager is a class variable of the class registering the callback... pluginInterface->registerCallback(std::bind(&Manager::handleData, std:

我有一个QCore应用程序,它在启动期间加载不同的插件,这些插件从不同的来源获取数据。这些数据通过一个注册的回调函数(每个插件相等)推回到我的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对象无法发出任何信号,这正是我迫切需要的

我认为通过plugin类的this指针调用回调函数(QEventLoop肯定正在运行,因为我可以使用插件内部的信号/插槽,以及从插件的其他非静态成员函数到我的QCoreApplication,而不会出现问题)。然而,似乎我错了。有人对所描述的行为有解释吗? 如果有任何其他细节需要,只要要求他们,我会尽量提供他们

问候,,
Robert

如果库是同步的,并且没有将控制流返回到事件循环,那么它将一直处于忙碌状态,并且无法调用插槽。您需要创建一个线程并在该线程中执行同步操作。

请说明如何使用第三方库执行网络请求。更具体地说,这个库是异步的吗?为什么不使用Qt网络模块呢?调用app.exec()后是否加载插件?旁注:只要连接是直接的(默认),信号/插槽不需要事件循环。它们只是同步函数调用。只有排队的连接才需要事件循环。@Frankosterfield是的,插件是在调用app.exec()后加载的。@Frankosterfield在尝试创建和启动QTimer时,我收到以下警告:“QTimer只能用于以qthread启动的线程”,并且QTimer永远不会发出超时信号。加载的插件和管理器类都在不同的线程中运行。线程基本上都是创建和启动的,如图所示。管理器中新创建的计时器将在插件线程的上下文中运行,但正如我所说的,没有有效的计时器loop@Riateche我不是直接自己做网络请求。这是埋藏在第三方图书馆深处的。我只调用lib提供的一个函数来完成所有繁重的工作,并回调我的类的静态成员函数(static void receiveData(void*data,void*callbackData)。在我存储的回调数据中,例如this指针。库是同步的。我不使用Qt网络库的原因是“接收一些数据”只是为了解释而被过分简化了。库正在做大量我不想手工做的专门工作