0

画像をマージするプログラム(C++)(QPainter)を作成しています。順番にうまくいきますが、OpenMP で並列化する必要があります。これどうやってするの?考えられる問題は、メモリ割り当てまたはネストされた for ループであると思います。ここでの最初の質問です。よろしくお願いします:)

int width = (x2-x1)+1;
int height = (y2-y1)+1;

//every image is 256x256
QImage mapa = QImage(256*width, 256*height, QImage::Format_ARGB32_Premultiplied);
QPainter painter(&mapa);

painter.setCompositionMode(QPainter::CompositionMode_SourceOver);

int x=0;
int y=0;


#pragma omp parallel
{
char *kawalek;

#pragma omp parallel for lastprivate(i) firstprivate(j) shared(x1, x2, y1, y2, painter) reduction(+:y, x)
for(i=y1; i<=y2; i++){
    x=0;
    #pragma omp parallel for shared(x1, x2, i, y, painter) reduction(+:x)
    for(j=x1; j<=x2; j++){
        {
        kawalek = (char*) malloc(snprintf(NULL, 0, "pobrane/%d_%d.png", j, i)+1);
        sprintf(kawalek, "pobrane/%d_%d.png", j, i);
        //cout << "czesc: " << kawalek << endl;
        QImage fragment(kawalek);
        painter.drawImage(x, y, fragment);

        //cout << "wspolrzedne czesci x: " << x << "y: " << y << endl;
        }
        x+=256;
    }
    y+=256;
}
}

painter.end();

mapa.save(filename);

@リアチェ、ありがとう;)

私の次の質問は、なぜそのループが高速化しないのかということです...

#pragma omp parallel for private(i) shared(ile)
    for(i=0; i<ile; i++){
        results[i].load(sciezki[i]);
    }
4

1 に答える 1

2

mapa同時に複数のスレッドから変数に (変数にペイントして) 書き込むことはできません。

Qt スレッドを使用する場合は、シグナルとスロットを使用して計算結果をメイン スレッドに渡すことをお勧めします。もう 1 つの方法は、メイン スレッドで結果の配列を作成することです。各スレッドは、独自の結果のみを配列の 1 つのセルに書き込みます。すべてのスレッドが終了したら、メイン スレッドは結果を読み取って描画する必要があります。

QImage::load() を使用して png ファイルをロードすることを検討してください。それはあなたのコードよりも簡単です。

于 2012-04-22T13:51:47.040 に答える