Qt的默认线程
Qt's default threads
当我用最少的代码启动一个新的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使用当前线程的事件循环。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Vulkan默认情况下已经有多线程了吗
- cv::cuda::Stream选择线程默认流
- 具有unique_ptr和线程的默认矢量构造函数
- 在 Visual Studio 中的调试中断时设置默认线程,C++
- 如何在 Windows 10 应用程序中访问C++默认线程池?
- 默认情况下,从工作线程发出Qt::信号会使主线程上的UI更新?
- Qt的默认线程
- 为什么无法创建堆栈大小小于默认大小的线程
- C++ OpenMP 比具有默认线程计数的串行慢
- 为一个任务设置固定线程数的TBB,为其他任务设置默认线程数
- 在没有默认构造函数的OpenMP中,每个线程执行一次代码
- Libuv -如何保持默认循环运行,直到程序中至少有一个线程存活