C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: イメージファイルを同時に作成するとエラーになる


(過去ログ 56 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■31990 / inTopicNo.1)  イメージファイルを同時に作成するとエラーになる
  
□投稿者/ ゆき (3回)-(2009/01/30(Fri) 17:02:07)

分類:[C#] 

ちょっと分からないので、ご教授願います。

OS:XP
言語:C# 2005


AというフォームでBというフォームをshow()メソッドを使用して複数表示させています。
表示したい画面数分ループさせて、
そのループ処理の中で、Bというフォームをインスタンスさせて表示という感じです。

Bというフォームの中では、
ロードのイベントで描画処理を行っています。

描画処理は、メタファイルを作成してそれを保存。
それからその保存したファイルをピクチャで表示させる処理です。

下記にその描画処理のソースを載せます。

if (this.picHistGraph.BackgroundImage != null)
{
// すべてのリソースを解放 //
this.picHistGraph.BackgroundImage.Dispose();
this.picHistGraph.BackgroundImage = null;
}

// Metafileのインスタンス生成 //
Graphics clsG = CreateGraphics();
IntPtr typIP = clsG.GetHdc();
Rectangle typR = new Rectangle(0, 0, this.picHistGraph.Width, this.picHistGraph.Height);
Metafile clsM = new Metafile(new MemoryStream(), typIP, typR, MetafileFrameUnit.Pixel);
clsG.ReleaseHdc(typIP);
clsG.Dispose();
clsG = Graphics.FromImage(clsM);


// ここで図を描画する処理 //


// リソースを解放
clsG.Dispose();
// イメージファイルのパスを作成
string strImgFPath = this.MakeImgFPath();
// イメージファイルを保存
clsM.Save(strImgFPath);
// イメージファイルを表示
this.picHistGraph.BackgroundImage = Image.FromFile(strImgFPath);
// リソースを解放
clsM.Dispose();



ソースのイメージファイルを保存させる処理の部分で、
「GDI+ で汎用エラーが発生しました。」とのエラーが表示されて落ちます。
ちなみに、デバックでブレークポイントを使用してフォームとフォームの間の処理の間隔をあけるとエラーにはなりません。
Aのフォームのループ処理でsleepを10秒ぐらいしてあげても上手くいきました。
なので、同時にイメージファイルの保存が行われているのが原因かなと思っています。
ただ、イメージファイルはファイル名に時間をつける事により同じファイル名にはならないようにしています。

Sleepさせる以外にエラーにならないようにする手はないでしょうか?
宜しくお願い致します。

引用返信 編集キー/
■31992 / inTopicNo.2)  Re[1]: イメージファイルを同時に作成するとエラーになる
□投稿者/ .SHO (614回)-(2009/01/30(Fri) 17:11:42)
No31990 (ゆき さん) に返信

> ただ、イメージファイルはファイル名に時間をつける事により同じファイル名にはならないようにしています。

時間って秒単位までしか見てなくて、結局は同じファイル名になってるとか?
引用返信 編集キー/
■32003 / inTopicNo.3)  Re[2]: イメージファイルを同時に作成するとエラーになる
□投稿者/ ゆき (4回)-(2009/01/30(Fri) 18:10:01)
2009/01/30(Fri) 18:10:36 編集(投稿者)
2009/01/30(Fri) 18:10:31 編集(投稿者)

No31992 (.SHO さん) に返信

> 時間って秒単位までしか見てなくて、結局は同じファイル名になってるとか?

その通りでした。ファイル名を別のやつにしたら上手くいきました。
有難う御座いました。
解決済み
引用返信 編集キー/
■32012 / inTopicNo.4)  Re[1]: イメージファイルを同時に作成するとエラーになる
□投稿者/ Jitta on the way (262回)-(2009/01/30(Fri) 18:26:33)
No31990 (ゆき さん) に返信
> ちょっと分からないので、ご教授願います。
>
> OS:XP
> 言語:C# 2005
>
>
> AというフォームでBというフォームをshow()メソッドを使用して複数表示させています。
> 表示したい画面数分ループさせて、
> そのループ処理の中で、Bというフォームをインスタンスさせて表示という感じです。
>
> Bというフォームの中では、
> ロードのイベントで描画処理を行っています。
>
> 描画処理は、メタファイルを作成してそれを保存。
> それからその保存したファイルをピクチャで表示させる処理です。
>
> 下記にその描画処理のソースを載せます。
>
> if (this.picHistGraph.BackgroundImage != null)
> {
> // すべてのリソースを解放 //
> this.picHistGraph.BackgroundImage.Dispose();
> this.picHistGraph.BackgroundImage = null;
> }
>
> // Metafileのインスタンス生成 //
> Graphics clsG = CreateGraphics();
> IntPtr typIP = clsG.GetHdc();
typIP を clsG から導出してるけど、Dispose のタイミングは適切?


> Rectangle typR = new Rectangle(0, 0, this.picHistGraph.Width, this.picHistGraph.Height);
> Metafile clsM = new Metafile(new MemoryStream(), typIP, typR, MetafileFrameUnit.Pixel);
この MemoryStream って、閉じられるの?


> clsG.ReleaseHdc(typIP);
> clsG.Dispose();
ここでリリース、ディスポーズして、メタファイルが参照しているものはどうなる?

> clsG = Graphics.FromImage(clsM);
>
>
> // ここで図を描画する処理 //
>
>
> // リソースを解放
> clsG.Dispose();
> // イメージファイルのパスを作成
> string strImgFPath = this.MakeImgFPath();
> // イメージファイルを保存
> clsM.Save(strImgFPath);
> // イメージファイルを表示
> this.picHistGraph.BackgroundImage = Image.FromFile(strImgFPath);
> // リソースを解放
> clsM.Dispose();
>
>
>
> ソースのイメージファイルを保存させる処理の部分で、
> 「GDI+ で汎用エラーが発生しました。」とのエラーが表示されて落ちます。
> ちなみに、デバックでブレークポイントを使用してフォームとフォームの間の処理の間隔をあけるとエラーにはなりません。
> Aのフォームのループ処理でsleepを10秒ぐらいしてあげても上手くいきました。
> なので、同時にイメージファイルの保存が行われているのが原因かなと思っています。
> ただ、イメージファイルはファイル名に時間をつける事により同じファイル名にはならないようにしています。
>
> Sleepさせる以外にエラーにならないようにする手はないでしょうか?
> 宜しくお願い致します。
>

タイムラインを書いて、オブジェクトの生存期間と、参照期間を書き込む。参照期間中は活きているようにしてあげればいいと思います。
引用返信 編集キー/
■32016 / inTopicNo.5)  Re[3]: イメージファイルを同時に作成するとエラーになる
□投稿者/ Jitta on the way (263回)-(2009/01/30(Fri) 18:29:26)
No32003 (ゆき さん) に返信
> 2009/01/30(Fri) 18:10:36 編集(投稿者)
> 2009/01/30(Fri) 18:10:31 編集(投稿者)
>
> ■No31992 (.SHO さん) に返信
>
>>時間って秒単位までしか見てなくて、結局は同じファイル名になってるとか?
>
> その通りでした。ファイル名を別のやつにしたら上手くいきました。
> 有難う御座いました。

が!
乗り換えが済んだら解決してたorz
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -