使用QtConcurrent小结

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

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

常用的run方法注释如下:

 

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

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

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

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

测试代码如下:

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

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

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

测试代码如下:

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

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

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

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

测试代码如下:

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

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

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

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

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

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

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

 

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

最后进行一个小测试

测试代码如下:

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

资源管理器中截图如下:

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

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

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QtConcurrent 是 Qt 提供的一个并发编程框架,可以方便地实现多线程、并行计算等操作。使用 QtConcurrent 可以大大简化多线程编程的难度,提高编程效率。 下面是使用 QtConcurrent 的基本步骤: 1. 包含头文件 需要在代码中包含 QtConcurrent 模块的头文件: ```cpp #include <QtConcurrent/QtConcurrent> ``` 2. 定义任务函数 在使用 QtConcurrent 进行多线程编程时,需要定义一个函数用于执行任务。这个函数应该是一个可重入的函数,即不依赖于任何全局变量,只依赖于传入的参数。 ```cpp void myTask(int val) { // 执行任务 } ``` 3. 调用 QtConcurrent 使用 QtConcurrent 可以方便地创建线程,并将任务函数交给线程执行。 ```cpp // 创建一个线程,并将任务函数交给线程执行 QFuture<void> future = QtConcurrent::run(myTask, val); ``` 其中,`myTask` 是任务函数,`val` 是传入的参数。`QtConcurrent::run` 函数返回一个 `QFuture` 对象,可以用于查询任务状态、等待任务完成等操作。 4. 查询任务状态 可以使用 `QFuture` 对象的 `isFinished()` 函数查询任务是否已完成,或者使用 `isRunning()` 函数查询任务是否正在执行。 ```cpp // 查询任务是否已完成 if (future.isFinished()) { // 任务已完成 } ``` 5. 等待任务完成 如果需要等待任务完成,可以使用 `waitForFinished()` 函数。此函数会阻塞当前线程,直到任务完成。 ```cpp // 等待任务完成 future.waitForFinished(); ``` 以上就是使用 QtConcurrent 进行多线程编程的基本步骤。在实际开发中,还可以使用 `QFutureWatcher` 监听任务状态变化,使用 `mapped` 和 `filtered` 函数实现并行计算等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值