2017-04-06 1 views
1

Ich mache einige Bildverarbeitung auf einige Bilder, die ich aus Datei laden. Ich habe eine Klasse mit Funktionen zum Laden, Ausführen und Speichern. Ich lade und speichere immer im Hauptthread in serieller Reihenfolge, aber ich führe Aufrufe an verschiedenen Bildern durch. Wenn ich den Befehl fädle, schlägt das Speichern fehl, wenn ich das Ausführen nicht ausführe, funktioniert es. Ich lade ein Bild, klon es 3 mal, mache dann Änderungen an diesen und speichere sie alle. Die Dateinamen gespeichert werden, um nicht die gleichen sind wie das Originalbild geladen inSpeichern GDI + Bitmap nach Gewindeoperationen auf es

Dies funktioniert.

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

Dies gilt nicht:

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

Ausnahme in Bild :: Save GdipSaveImageToFile:

Lesezugriffsverletzung. Dies war 0xCCCCCCCC.

meine Funktion sieht wie folgt speichern:

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 ist ein privates Mitglied ProcessImage, die ein Zeiger auf eine Bitmap ist.

Danke. Kann bei Bedarf mehr Code bereitstellen.

Antwort

1

Gelöst

die ProcessImage process1 an einen das Problem behoben Zeiger zu ändern. Das Objekt und nicht ein Zeiger auf einen std :: thread übergeben, scheint nach Wert und nicht nach Verweis zu verlaufen, etwas, das mir nicht bewusst war. Jemand anderes würde bestätigen müssen, ob das richtig ist.

Verwandte Themen