迭代QFutureSynchronizer <t> :: results

时间:2017-12-13 21:21:59

标签: c++ boost iterator qt5 qtconcurrent

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

# Using lambda keyword to create a dynamic menu.
import tkinter as tk

def f(x):
    print(x)

root = tk.Tk()
menubar = tk.Menu(root)
root.configure(menu=menubar)
menu = tk.Menu(menubar, tearoff=False)
l = ['one', 'two', 'three']
for i in l:
    menu.add_command(label=i, command=lambda x=i: f(x))
menubar.add_cascade(label='File', menu=menu)
root.mainloop()

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

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);
 }

Up_corr和Down_corr都是QFutureSynchronizer,并且定义良好,因为此线程中存在的第三种方法正在运行。另外,在通过上面的循环之前,我正在等待Up_corr和Down_corr QtConcurent :: run都完成了。

此代码变体也无效

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

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

唯一有效的方法是:

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++;
}

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

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

1 个答案:

答案 0 :(得分:0)

我不知道foreach宏,但假设它类似于基于范围的for,它会使futures()的结果保持活跃状态​​。其他变体将此结果用作表达式的一部分,然后让它死掉:只有直接绑定到const&&&的临时绑定才会保持活动状态。表达式中使用的其他临时值在完整表达式结束时被销毁。你可能想尝试像

这样的东西
// ...
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);
}