当我用最少的代码启动一个新的 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 调用 RegisterDragDrop
原生 Windows 函数引起的。当我跳过 QWindowsWindow::registerDropSite
执行时,不会创建这 3 个线程。即使在 RegisterDragDrop
文档中也没有关于线程的解释,更不用说 Qt 文档了。显然,当使用不同的操作系统或 Qt 版本时,这一事实可能会有所不同(例如,您可以在不支持拖放支持的情况下构建 Qt)。您可以找出为什么为您创建线程的唯一方法是进行实验。我认为 OS X 也给你一些惊喜。
第四个线程对我来说是个谜:调试器无法检测到它何时启动。也许这个线程是由调试器引起的。
正如我所料,@tebe 说 Qt 为 QTimer 处理产生了额外的线程是错误的(我不知道所有情况,但就我而言,这肯定是不正确的)。 QTimer 使用当前线程的事件循环。
关于c++ - Qt 的默认线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20616585/