Qt的默认线程

时间:2013-12-16 17:10:41

标签: c++ macos qt

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

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

1 个答案:

答案 0 :(得分:8)

我现在看到你在与实际问题相反的问题上提出了好奇心。我们来做一些研究。

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

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

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