アットウィキロゴ

Qt Tips

ループを並列化する。 変更前

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で中断、再開、終了待ち等ができる。

最終更新:2010年02月10日 14:23