- PR -

C#のMDIアプリケーションでメモリ使用量が増え続ける

1
投稿者投稿内容
ぺそまる
会議室デビュー日: 2004/10/01
投稿数: 14
投稿日時: 2005-11-21 11:16
C#でMDIのアプリケーションを作っています。
複数の子ウィンドウをCloseメソッドとShowメソッドで切り換えて表示しているのですが、
アプリケーションを長時間動かしていると、徐々に子ウィンドウの表示が遅くなります。
タスクマネージャで見ると、子ウィンドウの表示を切り換えるごとに
メモリ使用量が少しずつ増えています。
同じような経験をされた方はいますか?
子ウィンドウの表示が遅くならないような解決策はありましたか?
何かヒントになるようなことでもあればお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-21 11:33
引用:

ぺそまるさんの書き込み (2005-11-21 11:16) より:

C#でMDIのアプリケーションを作っています。
複数の子ウィンドウをCloseメソッドとShowメソッドで切り換えて表示しているのですが、


Close をコードから実行しているのは判りましたが、
どのようなタイミングでどこで実行しているのでしょうか?
(コードがないので判りません)

MDI 子フォームの [x]閉じる ボタンで閉じた場合はどうでしょうか?

引用:

アプリケーションを長時間動かしていると、徐々に子ウィンドウの表示が遅くなります。
タスクマネージャで見ると、子ウィンドウの表示を切り換えるごとに
メモリ使用量が少しずつ増えています。


メモリ使用量は、いつも信用できる値とは限りませんよね。
たとえば、MDI 親フォームを最小化すれば激減しますよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぺそまる
会議室デビュー日: 2004/10/01
投稿数: 14
投稿日時: 2005-11-21 15:06
じゃんぬねっとさん、返信ありがとうございました。

●子フォームの表示切り換えのタイミングについて
親フォーム内に複数のボタンを配置しており、
各ボタンをクリックしたタイミングで、
対応する子フォームをnewしてShowで表示しています。
他の子フォームが表示されていたら、子フォームはCloseしています。
たとえば、子1を表示中にボタンをクリックして子2を表示する場合には、
・・・
子1.Close();
子1.Dispose();
子2 = new 子2Form();
子2.Show();
・・・
のような順でメソッドを呼んでいます。

子フォームのコントロールボックスは表示しないようにしているため、
[x]閉じるボタンでどうなるかについては、まだ試していません。

●メモリ使用量について
「いつも信用できる値とは限りません」という件については、
別のサイトでも話題になっていましたね。
タスクマネージャで見ると少しずつ増えるので気になるのですが、
表示が遅くなることとは関係ないかもしれません。

自分と同じような現象を経験された方がいないのであれば、
自分のアプリケーションの作り方に問題があるのか?
と思っています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-21 15:13
引用:

ぺそまるさんの書き込み (2005-11-21 15:06) より:

子1.Close();
子1.Dispose();
子2 = new 子2Form();
子2.Show();


MDI 子フォームは、親 MDI フォームで一元管理されており、
MDI 子フォーム内に記述されていることは一切ないということで宜しいですか?

引用:

子フォームのコントロールボックスは表示しないようにしているため、
[x]閉じるボタンでどうなるかについては、まだ試していません。


親から Close するために、どこかに参照は取っていますよね?
どのように管理しているのでしょうか?
MDIChildren?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぺそまる
会議室デビュー日: 2004/10/01
投稿数: 14
投稿日時: 2005-11-21 15:59
引用:

じゃんぬねっとさんの書き込み (2005-11-21 15:13) より:
MDI 子フォームは、親 MDI フォームで一元管理されており、
MDI 子フォーム内に記述されていることは一切ないということで宜しいですか?


厳密に書くと、子フォーム内に他の子フォームを表示するボタンを
配置しているフォームもあるのですが、
今回の現象については、親フォームに配置したボタンだけで
表示を切り換えたときにも起きます。

引用:

親から Close するために、どこかに参照は取っていますよね?
どのように管理しているのでしょうか?
MDIChildren?


親フォームのMdiChildrenから子フォームを取得してCloseしています。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-21 17:55
引用:

アプリケーションを長時間動かしていると、徐々に子ウィンドウの表示が遅くなります。



子ウィンドウあるいは子ウィンドウ内で使用しているコントロールで独自の描画処理を行っていて、そこで何かリソースリークをしているとか。
ぺそまる
会議室デビュー日: 2004/10/01
投稿数: 14
投稿日時: 2005-11-21 20:53
引き続きデバッグしていたところ、
問題がありそうな箇所を見つけました。

子フォームのLoad内でオブジェクトを生成し、
親フォームが持っているオブジェクトに追加していたのですが、
子フォームをCloseするときに削除していなかったため、
この子フォームを表示するたびにオブジェクトが増えて、
処理が遅くなっていました。
子フォームをCloseするタイミングで、
生成したオブジェクトを削除するように修正したところ、
表示が遅くなる現象が起きなくなりました。

回答くださったお二人には、ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)