2

我正在尝试将 Qt 用作库(类似于this),因为我想在一些当前非 Qt 应用程序中重用 Qt 类,并在共享库中作为跨平台胶水。一切都是非 GUI 的。

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

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

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

我将学习QCoreApplicationPrivate源代码(目前是 Windows 和 Linux),但非常感谢任何正确方向的提示。

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

Edit1:感谢 Kuba 的回答,看来QCoreApplication事件循环对于调度计时器和套接字事件来说不是必需的。所以一些QtCore模块需要QCoreApplication的实例,但不需要有一个正在运行的应用程序事件循环。

4

1 回答 1

3

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

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

QCoreApplication 的存在似乎不是问题。事情变得更加棘手QApplication- 您可以在非 gui 线程中启动它,但它不可移植,并且无法在 OS X 上运行。我试图弄清楚为什么它不起作用,但我没有现在有很多时间来提供令人满意的解决方案——还没有。

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

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

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

于 2012-06-06T23:15:23.293 回答