当前位置:   article > 正文

工业软件架构3:(QT和C++实现)

工业软件架构3:(QT和C++实现)

1. 并行复杂任务

当某些耗时操作本身需要开几个子线程来完成,通常意味着这些操作非常复杂,可能涉及多步计算或并行处理。
在这种情况下,需要更加精细地管理线程,以确保操作的并发性和主线程的响应性。以下是处理这种情况的推荐方法和架构设计。

1.1 使用 QThreadPool 和 QRunnable 进行任务并行化

QThreadPool 和 QRunnable 是 Qt 提供的工具,用于高效地管理并发任务。你可以将耗时操作的不同步骤封装为独立的任务,并将它们提交给 QThreadPool 来并行执行。

假设我们有一个复杂的操作需要同时处理多个子任务,每个子任务都需要在不同的线程中运行。

class ComplexTask : public QRunnable 
{
   
public:
    ComplexTask(int taskId) : taskId(taskId) {
   }

    void run() override 
    {
   
        // 模拟耗时任务
        qDebug() << "Task" << taskId << "started.";
        QThread::sleep(2);  // 模拟长时间运行
        qDebug() << "Task" << taskId << "completed.";
    }

private:
    int taskId;
};

主任务可以将多个 ComplexTask 提交给 QThreadPool 来并行执行:

class ComplexOperation : public QObject {
   
    Q_OBJECT

public:
    ComplexOperation(QObject *parent = nullptr) : QObject(parent) {
   }

    void execute() 
    {
   
        QThreadPool *pool = QThreadPool::globalInstance();
        for (int i = 0; i < 5; ++i) 
        {
   
            pool->start(new ComplexTask(i));
        }

        // 等待所有任务完成(可选)
        pool->waitForDone();
        emit operationCompleted();
    }

signals:
    void operationCompleted();
};

1.2 使用 QFuture 和 QFutureWatcher 进行异步任务管理

QFuture 和 QFutureWatcher 提供了一种更高级的方式来管理和监控异步任务,特别适合在主线程中等待或监听多个子线程任务的完成状态。

class ParallelTaskManager : public QObject
 {
   
    Q_OBJECT

public:
    ParallelTaskManager(QObject *parent = nullptr) : QObject(parent) {
   }

    void executeComplexOperation() 
    {
   
        QVector<QFuture<void>> futures;
        for (int i = 0; i < 5; ++i)
         {
   
            QFuture<void> future = QtConcurrent::run(this, &ParallelTaskManager::performTask, i);
            futures.append(future);
        }

        QFutureWatcher<void> *watcher = new QFutureWatcher<void>(this);
        connect(watcher, &QFutureWatcher<void>::finished, this, &ParallelTaskManager::onAllTasksCompleted);
        watcher->setFuture(
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/1021394
推荐阅读
相关标签
  

闽ICP备14008679号