Qt qcore对qcore应用程序的依赖性

Qt qcore对qcore应用程序的依赖性,qt,shared-libraries,code-reuse,Qt,Shared Libraries,Code Reuse,我试图将Qt用作库(类似于),因为我想在一些当前非Qt应用程序中重用Qt类,并在共享库中作为跨平台的粘合剂。一切都不是GUI 有些问题可以通过DirectConnection轻松避免,有些问题可以通过私有事件循环解决,甚至可以在线程中运行一个线程,它也可以工作(最后的手段) 我想知道哪些模块依赖于QCoreApplication的运行实例,没有它就无法工作 某些Qt模块(在QtCore中)确实需要一个QCoreApplication实例才能正常运行。例如,QTimer依赖QCoreApplica

我试图将Qt用作库(类似于),因为我想在一些当前非Qt应用程序中重用Qt类,并在共享库中作为跨平台的粘合剂。一切都不是GUI

有些问题可以通过DirectConnection轻松避免,有些问题可以通过私有事件循环解决,甚至可以在线程中运行一个线程,它也可以工作(最后的手段)

我想知道哪些模块依赖于QCoreApplication的运行实例,没有它就无法工作

某些Qt模块(在QtCore中)确实需要一个QCoreApplication实例才能正常运行。例如,QTimer依赖QCoreApplication来调度计时器事件。 我正在阅读,它似乎依赖于QThreadPool的一个全局实例,我将尝试看看应用程序的执行是否至关重要,或者该实例是在首次访问时创建的,或者可能不是

我将学习QCoreApplicationPrivate源代码(目前为Windows和Linux),但任何正确方向的提示都将不胜感激

核心应用程序的其他功能依赖性是什么?请注意,这可能取决于操作系统


Edit1:多亏了Kuba的回答,调度计时器和套接字事件似乎不需要QCoreApplication事件循环。因此,一些QtCore模块需要QCoreApplication的实例,但不需要运行应用程序事件循环。

您将
QCoreApplication
的存在与运行事件循环混为一谈。这两个概念是不同的。对于后者,您可能需要前者,但后者不必与前者在同一线程中运行

最值得注意的是,如果在构建QCoreApplication的线程中没有任何事件要分派,那么实际上不必调用
qApp->exec()

QCore应用程序的存在可以说不是问题。使用
QApplication
,事情会变得更加棘手——您可以在非gui线程中启动它,但它不可移植,在OS X上也不起作用。我正试图找出它不起作用的原因,但我现在没有太多时间提供满意的解决方案——还没有

还存在一种误解,即需要运行QCoreApplication的事件循环才能将套接字通知和计时器事件分派给其他线程。QCoreApplication的事件循环没有什么特别之处。有一个特定于平台的QAbstractEventDispatcher实例,当您在该线程中实例化第一个QEventLoop时,会为该线程创建该实例。QEventLoop不知道该平台的任何具体信息

QCoreApplication的
exec()
方法非常简单,它创建了QEventLoop的实例,因此将创建特定于平台的QAbstractEventDispatcher的实例。这个例子在任何方面都不是特别的。就我的代码阅读所知,它与在任何其他线程中创建的任何其他事件调度器相同


如果所有底层窗口系统都支持它,那么实际上就有可能使QtGUI代码多线程化——每个线程的事件接收和调度已经作为一个小的第一步出现了。最大的障碍,可能是唯一的一个,将是X库及其应用程序。显示锁显然是线程之间的争用问题。您需要每个想要与GUI对话的线程打开到X服务器的单独连接,我不知道是否有支持Xlib的方法。

+1了解详情。某些QCore函数可能只需要非空的QCoreApplication::instance(),但不一定需要运行事件循环。有些(比如计时器)需要应用程序事件循环。我认为计时器不需要应用程序事件循环。计时器只需要在使用计时器输出的线程中运行事件循环。如果线程B中有QObject,线程A中有QApplication,则可以在线程B中自由使用QTimer,将其
timeout()
信号连接到QObject实例的插槽。当然,您必须在线程B中运行事件循环。这是QCoreApplication中的注释所说的:QCoreApplication包含主事件循环,其中包含来自操作系统的所有事件(例如,计时器和网络事件)以及其他源的处理和调度。同样在QEventDispatcherWin32Private::sendTimerEvent中,计时器事件也是这样传播的:QCoreApplication::sendEvent。我还应该看看Linux版本,看看这是否只是WindowsSendEvent不会被发送到其他线程,所以如果QCoreApplication只发送sendEvent,它就不会工作。我得试试看。