【问题标题】:Qt's default threadsQt 的默认线程
【发布时间】:2014-01-04 04:16:31
【问题描述】:

当我用最少的代码启动一个新的 Qt 应用程序并运行它时,我看到有许多线程在运行,最少为 2,最多可有 5 个。它通常稳定在 2 , 直到我拖动窗口,此时我看到多达 4 个线程正在运行。

这是我正在使用的所有代码:-

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget mainWindow;
    mainWindow.show();

    return a.exec();
}

谁能解释为什么会有不同的线程以及它们可能用于什么?最初我只希望有一个,但如果用一秒钟来处理消息也不会感到惊讶。但是,其他线程的原因是什么?

【问题讨论】:

  • 所有用户代码默认在主线程中执行。可能还有其他线程,但它们被 Qt 的内部实现或调试器使用。当你编写普通的应用程序时,你不需要考虑其他线程。除非您使用 Qt API 创建新的用户线程,否则所有与事件、信号或插槽相关的代码都将在主线程中执行。
  • @tebe,从问题中的代码可以看出,没有使用计时器。你看到的所有代码都在那里。
  • @PavelStrakhov,“当你编写普通应用程序时”——我的主应用程序不是所谓的“普通”应用程序,所以我正在创建一个测试应用程序来查看线程发生了什么,但不是没想到会从这么少的代码中看到 5 个线程。
  • 如果您开始担心 QT 内部使用的线程数,那么您做错了。如果没有其他原因,那么因为它是内部实现,并且可以随时更改。当然,除非您出于好奇而想知道这一点……
  • @yosim,我不担心;这是一项研究,有趣的是,还没有人能够回答这个问题。

标签: c++ macos qt


【解决方案1】:

我现在看到您是出于好奇而不是实际问题。让我们做一些研究。

我尝试在 Windows 上使用 MSVC 工具包在 Qt 5.1 上运行您的程序。我将调试器配置为在线程创建时中断。我看到已经产生了 4 个额外的线程。其中 3 个是由 Qt 调用 RegisterDragDrop 原生 Windows 函数引起的。当我跳过QWindowsWindow::registerDropSite 执行时,不会创建这3 个线程。即使在 RegisterDragDrop 文档中也没有关于线程的解释,更不用说 Qt 文档了。显然,当使用不同的操作系统或 Qt 版本时,这一事实可能会有所不同(例如,您可以在不支持拖放支持的情况下构建 Qt)。您可以找出为什么为您创建线程的唯一方法是进行实验。我认为 OS X 也给你一些惊喜。

第四个线程对我来说是个谜:调试器无法检测到它何时启动。也许这个线程是由调试器引起的。

正如我所料,@tebe 说 Qt 为 QTimer 处理产生了额外的线程是错误的(我不知道所有情况,但在我的情况下这肯定是不正确的)。 QTimer 使用当前线程的事件循环。

【讨论】:

  • 感谢 Pavel 抽出宝贵时间调查此事。这都是有趣的东西,拖放确实与我所看到的相关,尽管正如你所说,调试器中仍然有一个线程不会停止。我不希望计时器在不同的线程上运行,否则这意味着 GUI 可以通过使用计时器从被阻塞中解脱出来,而不必创建额外的线程。我会继续研究这个,看看 OSX 的比较。
猜你喜欢
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多