在对其进行线程操作后保存 GDI+ 位图

Saving GDI+ Bitmap after threaded operations on it

我正在对从文件加载的一些图像进行一些图像处理。我有一个具有加载、执行和保存功能的 class。我总是在主线程中串行加载和保存,但我正在对不同的图像执行线程调用。如果我线程执行保存失败,如果我不线程执行它工作。我加载一个图像,将其克隆 3 次,然后对这些图像进行更改并全部保存。正在保存的文件名与加载的原始图像不同。

这个有效:

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

这不是:

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

Image::Save GdipSaveImageToFile 中的异常:

read access violation. this was 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 的私有成员,它是指向位图的指针。

谢谢。如果需要,可以提供更多代码。

已解决

将 ProcessImage process1 更改为指针解决了问题。 传入对象而不是指向 std::thread 的指针似乎是按值而不是引用传递,这是我没有意识到的。其他人必须确认这是否正确。