Qt的默认线程

Qt's default threads

本文关键字:线程 默认 Qt      更新时间:2023-10-16

当我用最少的代码启动一个新的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();
}

有人能解释为什么会有不同的线程以及它们可能用于什么吗?起初我只期望一个,但如果第二个用于处理消息,我也不会感到惊讶。然而,其他线程的原因是什么?

我现在明白了,你问问题是出于好奇,而不是实际问题。让我们做一些调查。

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

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

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