2012-04-22 1 views
0

이미지 (QPainter)를 병합하려면 프로그램 (C++)을 설치해야합니다. 순차적 인 방식으로 작업이 훌륭하지만 OpenMP와 병렬 처리해야합니다. 어떻게해야합니까? 가능한 문제는 메모리 할당 또는 루프에 중첩 된 것입니다. 그것은 사전에 감사합니다 :)OpenMP 중첩 루프 (Qt 사용)

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

@Riateche, 감사, 여기 내 첫 번째 질문) 그 루프 속도를하지 않는 이유 나의 다음 질문은

...

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

답변

2

동시에 여러 스레드에서 변수 mapa에 (그리기로) 쓸 수 없습니다.

Qt 스레드를 사용한다면 신호와 슬롯을 사용하여 계산 결과를 주 스레드에 전달할 것을 권합니다. 또 다른 방법은 메인 스레드에서 결과의 배열을 만드는 것입니다. 각 스레드는 자신의 결과만을 배열의 한 셀에 씁니다. 모든 스레드가 끝나면 주 스레드는 결과를 읽고 페인트해야합니다.

QImage :: load()를 고려하여 png 파일을로드하십시오. 코드보다 간단합니다.

+0

>> 다른 방법은 메인 스레드에 결과 배열을 만드는 것입니다. 배열은 어떻게 생겼을까요? – bgs

+0

예를 들어,'QImage * results = new QImage [count]'. –