【问题标题】:Iterating through QFutureSynchronizer<T>::results遍历 QFutureSynchronizer<T>::results
【发布时间】:2018-05-27 21:22:43
【问题描述】:

谁能告诉我这些代码有什么问题:

std::vector<double> vUp;
QFuture<double> tu, td;
foreach(boost::tie(tu, td), boost::combine(Up_corr.futures(), Down_corr.futures()))
{
   vUp.push_back((tu.result()+td.result())*0.5);
 }

我在运行时收到以下错误:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x51)

Up_corr 和 Down_corr 都是 QFutureSynchronizer 并且被很好地定义为该线程中存在的第三个方法正在工作。另外,在通过上述循环之前,我正在等待 Up_corr 和 Down_corr QtConcurent::run 都完成。

此代码变体也不起作用

std::vector<double> vUp;
QList< QFuture<double> >::const_iterator tu   = Up_corr.futures().cbegin();
QList< QFuture<double> >::const_iterator td = Down_corr.futures().cbegin();
for(size_t iCh = 0; iCh < 32; iCh++)
{
     vUp.push_back((tu->result()+td->result())*0.5);
     tu++;
     td++;
}

尝试访问 tu->result() 或 td->result() 时会出现同样的错误。

唯一有效的方法是:

std::vector<double> v1;
std::vector<double> v2;

foreach(QFuture<double> thread, Up_corr.futures())
       v1.push_back(thread.result());
foreach(QFuture<double> thread, Down_corr.futures())
       v2.push_back(thread.result());

for(size_t iCh = 0; iCh < 32; iCh++)
       vUp.push_pack((v1[iCh]+v2[iCh])*0.5);

为什么最后一个工作正常,而另外两个因 BAD ACCESS 而失败?

最后一种有效的方法不是最优的:要填充一个向量,我需要三个循环。对于 32 个元素,这没什么大不了的,但是,我还需要处理 List> 的 2k 个元素,并且减少时间是我的目标。

【问题讨论】:

    标签: c++ boost iterator qt5 qtconcurrent


    【解决方案1】:

    我不知道foreach 宏,但假设它类似于基于范围的for,它会保持futures() 的结果有效。其他变体将此结果用作表达式的一部分,然后让它消失:只有直接绑定到 const&amp;&amp;&amp; 的临时绑定保持活动状态。表达式中使用的其他临时对象在完整表达式的末尾被销毁。您可能想尝试类似

    // ...
    auto&& ucf = Up_corr.futures();
    auto&& dcf = Down_corr.futures();
    foreach(boost::tie(tu, td), boost::combine(ucf, dcf))
    {
        vUp.push_back((tu.result()+td.result())*0.5);
    }
    

    【讨论】:

    • 非常感谢,这确实解决了我的问题。仍然没有真正理解为什么我的代码的第二个变体最初不起作用。既然变体 1 已全面运行,我将继续使用它,因为在我看来,它会在时间上更有效率。再次感谢
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多