使用QtConcurrent小结

本文探讨了QtConcurrent库中的run方法特性,通过不同测试案例分析了线程的内存占用情况,证实了线程在循环中能自动回收,适合在Qt应用中高效管理并发任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先查看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); 
}

资源管理器中截图如下:

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

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

 

在Qt中,`QTimer` 是用于在特定时间间隔后执行操作的类。当你想在定时器触发的时候执行一些耗时操作,但又不想阻塞主线程,这时你可以使用 `QtConcurrent` 模块来利用多线程执行这些任务。 `QtConcurrent` 模块提供了一组高级函数,这些函数可以让你很容易地利用多核处理器。在Qt中使用 `QtConcurrent` 可以使得耗时的操作在后台线程中执行,而不会阻塞事件循环。这样主线程仍然可以响应用户的操作,提高应用程序的响应性。 下面是如何在 `QTimer` 中使用 `QtConcurrent` 的一个例子: ```cpp #include <QTimer> #include <QtConcurrent> #include <QFuture> #include <QFutureWatcher> // 定义一个耗时操作的函数 void longRunningFunction() { // 这里放置耗时操作的代码 } // 定时器触发时的槽函数 void timerTriggered() { // 使用QtConcurrent来运行耗时操作 QFuture<void> future = QtConcurrent::run(longRunningFunction); // 如果需要,可以使用QFutureWatcher来监控后台任务的进度或状态 QFutureWatcher<void> *watcher = new QFutureWatcher<void>(); connect(watcher, &QFutureWatcher<void>::finished, this, [watcher](){ // 耗时任务完成后执行的代码 watcher->deleteLater(); }); watcher->setFuture(future); } // 设置定时器 QTimer timer; connect(&timer, &QTimer::timeout, this, &YourClass::timerTriggered); timer.setInterval(1000); // 例如每秒触发一次 timer.start(); ``` 在这个例子中,每当定时器触发时,`timerTriggered()` 函数会被调用。这个函数创建了一个 `QFuture`,它是对异步计算结果的引用。`QtConcurrent::run()` 函数启动了一个后台线程来执行 `longRunningFunction()` 函数。这个函数可以执行任何长时间运行的操作,而不会阻塞主线程。如果需要对后台任务进行额外的控制或响应,可以使用 `QFutureWatcher`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值