2017-04-06 11 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プロセス1をポインタに変更すると問題が解決されました。 std :: threadへのポインタではなく、オブジェクトを渡すことは、値ではなく、私が知らなかったものを渡すようです。誰かがそれが正しいかどうかを確認する必要があります。

関連する問題