2017-12-13 9 views
0

は、誰かがコードのこれらの作品と間違っているものを私に言うことができる:はQFutureSynchronizer <T>を反復::結果

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の両方であり、このスレッドに存在する3番目のメソッドが機能しているので、よく定義されています。また、上記のループを通過する前に、Up_corrとDown_corr QtConcurent :: runの両方が終了するのを待っています。

コードのこの変異体はまたtu->結果()またはTD->結果を()にアクセスしようとすると、それは同じエラーを与える

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

が機能していません。

働いている唯一の方法は次のとおりです。

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

他の2つはBAD Accessで失敗しながら、最後の1が動作しているのはなぜ?

動作している最後の方法は最適ではありません。1つのベクトルを塗りつぶすには3つのループが必要です。 32要素については大きな問題ではありませんが、2k要素のList>を扱う必要があり、タイミングを短縮することが私の目的です。

答えて

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

ありがとう、これは本当に私の問題を解決します。私のコードの第二の変種がなぜ最初に機能しないのか、実際には分かりませんでした。変種1は完全に動作可能になったので、時間の中でより効率的になるように思えます。再度、感謝します –

関連する問題