- 📢博客主页:https://loewen.blog.csdn.net
- 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
- 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
- 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨
文章预览:
- 一. QtConcurrent::run异步线程操作
 
 
一. QtConcurrent::run异步线程操作
在Qt中,使用QtConcurrent::run来在异步线程中执行耗时操作,并将结果发送回主线程进行后续处理,是一种非常高效且简洁的方式。
以下是一个基于这种设计的C++流程示例:
1、 定义耗时函数
首先,你需要一个耗时函数,这个函数将在后台线程中被执行。
#include <QDebug>  
#include <QThread>  // 假设的耗时函数  
int longRunningTask(int input) {  // 模拟耗时操作  QThread::sleep(5); // 假设这个函数需要5秒钟来完成  qDebug() << "Task completed in thread" << QThread::currentThreadId();  return input * 2; // 假设的处理结果  
}
2、 使用QtConcurrent::run执行耗时函数
在你的主线程(通常是GUI线程)中,使用QtConcurrent::run来异步执行这个耗时函数。
#include <QtConcurrent>  
#include <QFutureWatcher>  // ... 在某个函数或方法中 ...  // 调用耗时函数  
int input = 10;  
QFuture<int> future = QtConcurrent::run(longRunningTask, input);  // 创建一个QFutureWatcher来监视future的状态  
QFutureWatcher<int> *watcher = new QFutureWatcher<int>();  
QObject::connect(watcher, &QFutureWatcher<int>::finished, [=]() {  // 当任务完成时,这里会被调用  if (watcher->result() != -1) { // 假设-1是某种错误码  int result = watcher->result();  qDebug() << "Result received in main thread:" << result;  // 在这里进行后续操作,使用result  }  watcher->deleteLater(); // watcher对象在任务完成后不再需要,使用deleteLater()来确保它会被适当地清理掉  
});  watcher->setFuture(future); // 将future与watcher关联起来,让watcher开始监视future的状态
代码结尾的watcher->setFuture(future);是将QFutureWatcher对象watcher与QFuture对象future关联起来。QFutureWatcher是一个模板类,用于监视QFuture对象的状态变化。当你调用QtConcurrent::run()时,它会返回一个QFuture对象,该对象代表了异步操作的结果。通过调用setFuture()方法,你可以让QFutureWatcher开始监视这个QFuture对象。
| 下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |