- 締切済み
画像読み込み時のOutOfMemory
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+で汎用エラー」といった例外が続発してしまうことです。マネージコードなのでリソースは自動的に解放されると思うのですが、それでも間に合わないのでしょうか?何か対処方法があれば、ご教示ください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- maiko0318
- ベストアンサー率21% (1483/6969)
>リソースは自動的に解放されると思うのですが この文章に引っかかりました。 Cでは確保したメモリーは自動開放はしないと記憶しています。 bmpを開放してみてください。
- kmee
- ベストアンサー率55% (1857/3366)
マニュアルより http://msdn.microsoft.com/ja-jp/library/stf701f5%28v=vs.110%29.aspx > 例外 > OutOfMemoryException > ファイルのイメージ形式が有効ではありません。 > または > GDI+ はファイルのピクセル形式をサポートしません。 > 解説 > ファイルのイメージ形式が有効でない場合、または、そのファイルのピクセル形式が GDI+ でサポートされていない場合、このメソッドは OutOfMemoryException 例外をスローします。 これに該当していませんか?
お礼
早速のアドバイス有難うございます。 私もそう考え、例外を起こす画像のみを集めて処理したところ、件数が少なければ例外が発生しませんでした。どうも数万件を処理した場合に、特に後半で例外が続発するので、何かリソースに関係しているのではないかと思い、今回の質問をしました。 それに、ひとつよく分からないのが、ご指摘の「形式がサポートされてない」とOutOfMemoryという言葉の関係です。形式がサポートされていならTypeNotSupportedとかを使えば良いのにと思いますが。
お礼
有難うございます。 自己解決しました。 画像を一枚処理するごとに、下のPumpMesage()を実行したら、例外が発生しなくなりました。 やはり、リソース開放がOSに伝わるのに時間が掛っていたのが原因かと思っています。 なお、マネージコードなのでbmpの解放を明示的に行うことはできないのではないでしょうか。 #pragma comment(lib, "User32.lib") void PumpMessage() { MSG msg; while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } }