我正在尝试将Qt用作库(类似于this),因为我想在一些当前非Qt应用程序中重用Qt类,并在共享库中重用交叉 - 平台胶水。一切都是非GUI。
DirectConnection 可以很容易地避免一些问题,有些问题可以通过私有事件循环来解决,甚至可以在一个线程中运行fake QCoreApplication并且它可以工作(最后的手段)。
我想知道哪些模块依赖于正在运行的 QCoreApplication 实例,没有它就无法工作。
某些Qt模块(在 QtCore 中)确实需要 QCoreApplication 的实例才能正常运行。例如, QTimer 依赖于 QCoreApplication 来调度计时器事件。 我正在阅读documentation for QtConcurrentRun,它似乎依赖于 QThreadPool 的全局实例,我即将尝试查看应用程序执行是否至关重要,或者可能是在第一次访问,或许不是。
我将学习 QCoreApplicationPrivate 源代码(目前是Windows和Linux),但我们非常感谢任何正确方向的提示。
核心应用程序的其他功能依赖性是什么?请注意,它可能取决于操作系统。
Edit1:感谢Kuba的回答,似乎 QCoreApplication 事件循环不需要调度定时器和套接字事件。因此,一些 QtCore 模块需要 QCoreApplication 的实例,但不需要运行应用程序事件循环。
答案 0 :(得分:3)
您正在混淆QCoreApplication
与正在运行的事件循环的存在。这两个是不同的概念。你可能需要前者用于后者,但后者不必与前者在同一个线程中运行。
最值得注意的是,如果您没有在构建QCoreApplication的线程中调度任何事件,则不必调用qApp->exec()
。
QCoreApplication的存在实际上是一个非问题。使用QApplication
变得更加毛茸茸 - 你可以在非gui线程中启动它,但是它不可移植,不适用于OS X.我试图找出它为什么不起作用,但是我现在没有太多时间提供令人满意的解决方案 - 还没有。
QCoreApplication的事件循环需要运行才能将套接字通知和计时器事件分派到其他线程,这也是一种误解。 QCoreApplication的事件循环并不特别。当您在该线程中实例化第一个QEventLoop时,会为线程创建一个特定于平台的QAbstractEventDispatcher实例。 QEventLoop对该平台一无所知。
QCoreApplication的exec()
方法非常简单,并创建了一个QEventLoop实例,因此将创建一个特定于平台的QAbstractEventDispatcher实例。这个实例在任何方面都不是特别的。它与任何其他线程中创建的任何其他事件调度程序相同,就我的代码读取到目前为止所述。
如果所有底层窗口系统都支持它,那么实际上可以使Qt GUI代码成为多线程 - 每个线程的事件接收和发送已经在那里作为一个小的第一步。可能是唯一的障碍是X库及其display lock。显示锁定是线程之间争用的明显问题。你需要每个想与GUI交谈的线程打开一个与X服务器分开的连接,我不知道是否有一种支持的方式从Xlib那里做到这一点。