gpt4 book ai didi

QtCore 对 QCoreApplication 的依赖

转载 作者:行者123 更新时间:2023-12-04 05:44:03 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

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

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

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

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

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

关于QtCore 对 QCoreApplication 的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10919851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com