2015-10-14 35 views
1

在Qt 5.5 for mac中,我試圖加快計算圖像緩衝區及其與QImage的顯示。我使用的是openMP指令,但是我意識到這與QImage顯示器有關。更新圖像顯示時的QImage和openmp

下面是代碼:

int = 65535  
newPaintImage = new QImage(naxis1, naxis2, QImage::Format_ARGB32); 
#pragma omp parallel for 
for (int ii = 0; ii < nPixels; ++ii) 
{ 
    cred = (int) 255 * red16[ii]/range; 
    cgreen = (int) 255 * green16[ii]/range; 
    cblue = (int) 255 * blue16[ii]/range;  

    QRgb argb = qRgba(cred, cgreen, cblue, 255); 
    QRgb* rowData = (QRgb*) newPaintImage->scanLine(ii/naxis1); 
    rowData[ii%naxis1] = argb; 
} 
newPaintWidget = new PaintWidget(newPaintImage, naxis1, naxis2); 

在上面的代碼,nPixels是圖像中的像素和red16green16的總數,和blue16是我的圖像的3色通道。它們的大小等於nPixels。值naxis1naxis2是寬度和高度(以像素爲單位)。

請注意並行化for循環的編譯指示。當我使用它時,我在圖像中出現亂碼,並且圖像的任何更新都會改變結果。 當我不使用pragma指令時,只使用一個線程,我的圖像正常,如預期的那樣。 我用這種並行化來更改和更新緩衝區,並且與顯示混亂。

有沒有更好的方法?像確保我的線程完成了工作,然後更新我的Qt對象的paintEvent中的顯示?或者一些相關的QImage是如何通過線程共享?...

感謝

+1

嘗試在您的OpenMP附註中添加'private(cred,cgreen,cblue)'。不確定它是否足夠,但它肯定是需要的。 – Gilles

+0

我讀的越多,我就越有信心'#pragma omp parallel for private(cred,cgreen,cblue)'應該足以讓您的代碼並行工作。不知道它會更快,因爲你的代碼大部分是內存綁定的。 – Gilles

+0

@gilles 好吧,我剛剛用'#pragma omp parallel for private(cred,cgreen,cblue)'試過了,我得到了一個編譯錯誤: '錯誤:期望的變量名稱 #pragma omp parallel for private(cred ,cgreen,cblue)' 我完全不知道這些指令。任何想法? –

回答

1

由於在註釋的建議,我固定它。需要使用pragma子句private來定義要使用的私有變量。

int cred2, cgreen2, cblue2 
#pragma omp parallel for private(cred2, cgreen2, cblue2) 
for (int ii = 0; ii < nPixels; ++ii) 
{ 
    cred2 = (int) 255 * red16[ii]/range; 
    cgreen2 = (int) 255 * green16[ii]/range; 
    cblue2 = (int) 255 * blue16[ii]/range; 
    QRgb argb = qRgba(cred2, cgreen2, cblue2, 255); 
    QRgb* rowData = (QRgb*) newPaintImage->scanLine(ii/naxis1); 
    rowData[ii%naxis1] = argb; 
} 
newPaintWidget = new PaintWidget(newPaintImage, naxis1, naxis2); 

是的,這是相當快!這與一些執行對比度拉伸的QSlider信號/插槽一起使用。我在這裏簡化了代碼。實際上,range正在改變,而不是固定的,例如red16[ii](red16[ii] - minValue)其中minValue隨一些QSliders發生變化。