文章预览:

  • 一. 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对象watcherQFuture对象future关联起来。QFutureWatcher是一个模板类,用于监视QFuture对象的状态变化。当你调用QtConcurrent::run()时,它会返回一个QFuture对象,该对象代表了异步操作的结果。通过调用setFuture()方法,你可以让QFutureWatcher开始监视这个QFuture对象。


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。