c++ - Qt 的默认线程

标签 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();
}

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

最佳答案

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

我尝试在 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/

相关文章:

objective-c - NSApplescript 不会接受 initWithContentsOfURL

c++ - 使用 Qt 和 C++ 时没有插槽,但出现 QMetaObject::connectSlotsByName 错误

c++ - 如何在离开(关闭或失去焦点)窗口之前显示模态确认消息?

c++ - 比较枚举和整数

c++ - Noobish 阵列问题 : Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted

git - 我正在使用哪个全局 gitignore?

c++ - Qt - 如何在 QGraphicsPixmapItem 中显示 gif(动画)图像

c++ - GNU Gettext 和宽字符

c++ - 我如何使用 DEV C++ 构建发布 exe?

c - 在 ARM macOS 上,当显式 raise() 信号时,某些返回地址在堆栈上会出现乱码