ループを並列化する。 変更前
foreach ( FCrossSection* section, mCrossSections ) {
if ( section ) {
section->UpdateImageData( inLowRange, inHighRange );
}
}
変更後
class update
{
public:
update( float low, float high ) : mLow(low), mHigh(high) {}
void operator ()( FCrossSection* section ) {
if ( section ) {
section->UpdateImageData( mLow, mHigh );
}
}
private:
float mLow, mHigh;
};
ここではパラメータを渡したいために関数オブジェクトを使っているが、普通の関数でも構わない。 注)この関数(およびここから呼び出される関数)はスレッドセーフでなければいけない。
QtConcurrent::blockingMap( mCrossSections, update(inLowRange, inHighRrange) );
時間
239.65ms→125.35ms
(コレクションの要素数:16、Intel CoreDuo1.83GHz)
コレクションの各要素に処理をほどこすmapと、コレクションの要素を選択するfilterの2種類ある。 それぞれについて非同期で実行するものと、完了を待つblockingの2種類がある。 非同期のものはQFutureで中断、再開、終了待ち等ができる。