首先查看QtConcurrent在使用时候的官方注释如下:

running devices在那里打开_资源管理器

使用其做法是在qmake文件中添加并且在使用时头文件也进行添加。

常用的run方法注释如下:

running devices在那里打开_资源管理器_02

 

意味着该函数返回一个单独的线程,该线程是从线程池中取得的,既然是从线程池中取得的线程意味着可能并不能立即执行,

只有当这个线程可获得时才进行执行,该线程不支持取消,停止或者进度显示,返回值只可以在正在执行或者完成状态是返回。那么现在问题来了,如果将该线程多次执行,放入循环中,该线程会自动进行回收工作吗?

以下就是见证奇迹的时刻了。

首先是测试程序在运行起来不做任何操作的程序大小

测试代码如下:

QString str = "canshu";
 for( int index = 0; index < 1000000; ++ index )
 {
 }

在资源管理器中内存占用为:

running devices在那里打开_程序运行_03

其次是测试在程序不使用线程只进行printf

测试代码如下:

QString str = "canshu"; for( int index = 0; index < 1000000; ++ index ) { outPut(); }

在程序运行过程中,此时没有绘制mainwindow窗口时,内存为如下图所示:

running devices在那里打开_资源管理器_04

程序运行结束后,占用内存同没有进行任何操作一样内存占用。

本次测试使用线程进行调用输出函数

测试代码如下:

QString str = "canshu"; 
for( int index = 0; index < 1000000; ++ index )
{ 
    QtConcurrent::run(this,&MainWindow::outPut); 
}

程序运行结束后,资源管理器截图如图所示:

running devices在那里打开_资源管理器_05

证明使用线程确实造成了内存占用过高的问题。

以下对比一下使用参数和不使用参数传递的效果。

使用参数进行测试的代码如下:

QString str = "canshu";
for( int index = 0; index < 1000000; ++ index ) 
{ 
    QtConcurrent::run(this,&MainWindow::outPutWithArg,str); 
}

资源管理器中内存截图如图所示:

 

running devices在那里打开_线程池_06

此结果为最终结果,在运行过程中出现过内存激增的情况,但最后降下来结果如上图。

最后进行一个小测试

测试代码如下:

QString str = "canshu"; 
for( int index = 0; index < 1000000; ++ index ) 
{ 
    outPutWithArg(str); 
}

资源管理器中截图如下:

running devices在那里打开_资源管理器_07

在最终似乎由于循环次数较多,导致输出没有输出正常。

因此,该线程是自带销毁的,可以在循环中放心使用。

running devices在那里打开_资源管理器_08