在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
是圖像中的像素和red16
,green16
的總數,和blue16
是我的圖像的3色通道。它們的大小等於nPixels
。值naxis1
和naxis2
是寬度和高度(以像素爲單位)。
請注意並行化for循環的編譯指示。當我使用它時,我在圖像中出現亂碼,並且圖像的任何更新都會改變結果。 當我不使用pragma指令時,只使用一個線程,我的圖像正常,如預期的那樣。 我用這種並行化來更改和更新緩衝區,並且與顯示混亂。
有沒有更好的方法?像確保我的線程完成了工作,然後更新我的Qt對象的paintEvent中的顯示?或者一些相關的QImage是如何通過線程共享?...
感謝
嘗試在您的OpenMP附註中添加'private(cred,cgreen,cblue)'。不確定它是否足夠,但它肯定是需要的。 – Gilles
我讀的越多,我就越有信心'#pragma omp parallel for private(cred,cgreen,cblue)'應該足以讓您的代碼並行工作。不知道它會更快,因爲你的代碼大部分是內存綁定的。 – Gilles
@gilles 好吧,我剛剛用'#pragma omp parallel for private(cred,cgreen,cblue)'試過了,我得到了一個編譯錯誤: '錯誤:期望的變量名稱 #pragma omp parallel for private(cred ,cgreen,cblue)' 我完全不知道這些指令。任何想法? –