プロが教えるわが家の防犯対策術!

VC++2010ExpressのWindows Applicationで画像のサムネールを作るプログラムを作っています。
概略、つぎの様なコーディングです(細部は気にしないで下さい)。

for filePath in dlg->Files{
try{
String^ FileName = Path::GetFileName(filePath);
Image^ img = Image::FromFiles(filePath);
Bitmap^ bmp = gcnew Bitmap(Image, 48, 48);
bmp->Save(FolderPath + "\\Thumbnails\\" + FileName);
}
chactch(System::Exception^ err){
Debug::Print("{0}", err->Massages);
}
}

問題は、数万件の画像を処理したときに、数千件までは順調に処理が進むのに、そのあと「OutofMemory」とか「メモリー不足」とか「GDI+で汎用エラー」といった例外が続発してしまうことです。マネージコードなのでリソースは自動的に解放されると思うのですが、それでも間に合わないのでしょうか?何か対処方法があれば、ご教示ください。

A 回答 (2件)

>リソースは自動的に解放されると思うのですが



この文章に引っかかりました。
Cでは確保したメモリーは自動開放はしないと記憶しています。
bmpを開放してみてください。
    • good
    • 1
この回答へのお礼

有難うございます。
自己解決しました。
画像を一枚処理するごとに、下のPumpMesage()を実行したら、例外が発生しなくなりました。
やはり、リソース開放がOSに伝わるのに時間が掛っていたのが原因かと思っています。
なお、マネージコードなのでbmpの解放を明示的に行うことはできないのではないでしょうか。

#pragma comment(lib, "User32.lib")

void PumpMessage()
{
MSG msg;
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}

お礼日時:2014/06/05 12:12

マニュアルより


http://msdn.microsoft.com/ja-jp/library/stf701f5 …
> 例外
> OutOfMemoryException
> ファイルのイメージ形式が有効ではありません。
> または
> GDI+ はファイルのピクセル形式をサポートしません。

> 解説
> ファイルのイメージ形式が有効でない場合、または、そのファイルのピクセル形式が GDI+ でサポートされていない場合、このメソッドは OutOfMemoryException 例外をスローします。

これに該当していませんか?
    • good
    • 0
この回答へのお礼

早速のアドバイス有難うございます。
私もそう考え、例外を起こす画像のみを集めて処理したところ、件数が少なければ例外が発生しませんでした。どうも数万件を処理した場合に、特に後半で例外が続発するので、何かリソースに関係しているのではないかと思い、今回の質問をしました。

それに、ひとつよく分からないのが、ご指摘の「形式がサポートされてない」とOutOfMemoryという言葉の関係です。形式がサポートされていならTypeNotSupportedとかを使えば良いのにと思いますが。

お礼日時:2014/06/05 09:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A