QT下的并行框架

ConcurrentRun

for (auto layIdx = 0; layIdx != cli->layerCount(); ++layIdx)
{
    QFutureWatcher<bool>* watcher = new QFutureWatcher<bool>();
    QObject::connect(watcher, SIGNAL(finished()), this, SLOT(renderLayerFinshed()));
    QFuture<bool> future = QtConcurrent::run(this, &CppBackendWorker::renderLayersInConCurrent, cli, layIdx);
    watcher->setFuture(future);
}
void CppBackendWorker::renderLayerFinshed()
{
    m_layerCount = m_layerCount + 1;

    QFutureWatcher<bool>* watcher = static_cast<QFutureWatcher<bool>*>(sender());
    watcher->deleteLater();  // 信号的指针释放

    if (m_layerTotal == m_layerCount)
    {
        // 所有任务做完进行后续处理;
        QMetaObject::invokeMethod(m_backend, "finishRenderingLayers", Qt::QueuedConnection);
    }
}
1 Concurrent中允许传入当前类的成员函数,通常此函数是一个耗时函数,本例中为renderLayersInConcurrent.

2 注意watcher这些指针的释放,在单次任务结束后删除watcher指针。如果是QFutureWatcher<bool> watcher; 再绑定信号槽是无效的,在堆上而非栈上.


mappedReduced

struct layerResult
{
    Typedef QMap<int, bool>layerCount;   
    QString m_stErrorInfo;//   QString m_strTargetFilePath;//生成目标文件的路径全称   
    layerCount layercount;
};

class SingleLayerProcess;  // 处理耗时任务的类

// 单个任务的处理,将处理结束的结果存入layerRes中
layerResult createLayerDate(const SingleLayerProcess& layer)
{   
    layerCount layercount;   
    layerResult layerRes;      
    SingleLayerProcess layerTemp = const_cast<SingleLayerProcess&>(layer);   
    if (!layerTemp.createEntity()) //耗时任务
    {    
        …   
    }   
    if (!layerTemp.manageSharpAngleAndExtraShell())  //耗时任务 
    {       
        …   
    }   
    if (!layerTemp.createSingleLayerData()) //耗时任务
    {       
        …   
    }   
    layercount[layer.getLayerIndex()] = true;   
    layerRes.layercount=layercount;     
    return layerRes;
} 

// 单线程处理,获取单任务的结果,进行统一处理
void mergeLayer(layerResult&result,const layerResult&signalLayersRes)
{   
    …
} 

// 对多个类似任务进行批量处理
QList<SingleLayerProcess> layers;
for (int index = iBegin; index < iEnd; ++index)
{
    SingleLayerProcess singleLayer(index, pCliFile, fillingParamStruct, fillType, strTargetFilePath);
    layers.push_back(singleLayer);
}
layerResult layerRet = QtConcurrent::mappedReduced(layers, createLayerDate, mergeLayer, ReduceOptions(OrderedReduce | SequentialReduce));
1 在 QFuture<T>mappedReduced(const Sequence &sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)中, Sequence可以是一个类的容器列表,可以创建一个处理耗时任务的类的list,此例中则是QList<SingleLayerProcess> layers.
2 MapFunction的返回值类型必须和reduceFunction的第2个参数相匹配,此例中则是layerResult类型
3 reduceFunction这一函数是任务队列进行结束的结果处理,单线程。你可以通过ReduceOptions控制得到结果的顺序。
4 只有mappedReduced可以进行cancle,concurrent::run不能进行cancle操作



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值