2017-04-06 19 views
1

我正在對從文件加載的一些圖像進行一些圖像處理。我有一個具有加載,執行和保存功能的類。我總是在串行主線程中加載並保存,但是我在不同的圖像上執行線程調用。如果我線程執行保存失敗,如果我沒有線程執行它的工作。我加載一張圖片,克隆它3次,然後對這些圖片進行修改並保存。正在保存的文件名是不一樣的,如加載的原始圖像線程操作之後保存GDI +位圖

這工作:

ProcessImage process1 = ProcessImage(L"IMG_1"); 
process1.Load(); 
process1.Execute(); 
process1.Save(); 

這不:在圖像::保存GdipSaveImageToFile

ProcessImage process1 = ProcessImage(L"IMG_1"); 
process1.Load(); 
thread t1(&ProcessImage::Execute, process1); 
t1.join(); 
process1.Save(); //exception 

例外:

讀取訪問衝突。 這是0xCCCCCCCC。

我保存功能如下:

void Save() { 
     CLSID pngClsid; 
     CLSIDFromString(L"{557CF406-1A04-11D3-9A73-0000F81EF32E}", &pngClsid); 

     destBright->Save(brightenOut.c_str(), &pngClsid); //exception 
     delete destBright; 

     //same again on 2 other Bitmaps 
    } 

destBright是processImage來的私有成員是一個指向位圖。

謝謝。如果需要可以提供更多的代碼。

回答

1

已解決

將ProcessImage process1更改爲一個指針修復了問題。 傳入對象,而不是一個指向std :: thread的指針似乎是通過值而不是引用傳遞的,這是我沒有意識到的。其他人將不得不確認這是否正確。