2017-12-13 8 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이며이 스레드에있는 세 번째 메소드가 작동 중일 때 잘 정의되어 있습니다. 또한 위의 루프를 통과하기 전에 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++; 
} 

을 작동하지 않습니다. 노력

유일한 방법은 : 다른 두 BAD 액세스에 실패하면서 왜 마지막이 작동

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

?

작동중인 마지막 방법은 최적이 아닙니다. 하나의 벡터를 채우려면 세 개의 루프가 필요합니다. 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이 완전히 작동하므로 시간이 지남에 따라 효율성이 향상 될 것입니다. 다시 한 번 감사드립니다. –