- - PR -
MDIフォームのメモリ開放について
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-10-05 17:16
初めて投稿します。宜しくお願いします。
VB.NETのMDIフォームについて教えて下さい。 現在、親フォームから子フォームを起動し、終了した際に使用メモリが減らない という現象が出ています。 サンプルで簡単なフォームを作成しましたがやはり同じ結果になりました。 現象例. タスクマネージャのプロセスタグで使用しているメモリ使用量をチェックする。 親フォーム起動時、約19M 子フォーム起動中、約21M 子フォーム終了後、約21M(子フォームは他に何も起動していない状態) 以下、サンプルのコードです。 ◆親フォーム◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim FRM As Object Try ' 必要な変数を宣言する Dim hMdiChildren As Form() ' 保有してるすべての MDI 子フォームを取得する hMdiChildren = Me.MdiChildren ' すべての MDI 子フォームを閉じる For Each hMdiChild As Form In hMdiChildren hMdiChild.Close() hMdiChild.Dispose() hMdiChild = Nothing GC.Collect() Next hMdiChild hMdiChildren = Nothing FRM = New Form2 '親フォームをこのフォームにする FRM.MdiParent = Me '子フォームを表示する FRM.SHOW() FRM.Location.Offset(FRM.Location.X * -1, 0) Catch Err As Exception Finally FRM = Nothing GC.Collect() End Try End Sub ◆子フォーム◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ Private Sub Form2_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed Me.Dispose(True) System.GC.Collect() End Sub ご教授のほうよろしくお願いします。 [ メッセージ編集済み 編集者: 茶坊主 編集日時 2005-10-05 17:56 ] | ||||||||||||||||||||
|
投稿日時: 2005-10-05 17:32
何か、私のサイトに似たようなソースがあったような。(変数のクセもそのままに)
まあそれはおいといて。
何故に Object?
意味はないです。
こちらは配列なので意味はあります。 ただし、GC を多少手助けする程度のもので必須ではありせん。
これ、おかしいと思いませんか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2005-10-05 17:34
お世話になります。
http://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html によると
とあるので、これが原因では? | ||||||||||||||||||||
|
投稿日時: 2005-10-05 17:42
こんにちは、じゃんぬ です。
GC.Collect メソッドで明示化しても? あ、本題を忘れていました。
もっとフォーム数を増やしてやって頂けませんか? この程度だと、異常だと断定できません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2005-10-05 17:44
じゃんぬねっと様、なおこ(・∀・)様、返信ありがとうございます。
引用: -------------------------------------------------------------------------------- 何故に Object? -------------------------------------------------------------------------------- 実際のPG側では複数のFormを1つのオブジェクトに入れて パターン別に起動していたためサンプルも同じように書きました。 引用: -------------------------------------------------------------------------------- コード: -------------------------------------------------------------------------------- Private Sub Form2_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed Me.Dispose(True) System.GC.Collect() End Sub -------------------------------------------------------------------------------- これ、おかしいと思いませんか? -------------------------------------------------------------------------------- 初心者なものでとりあえず書かないとダメだという認識しか有りません。 何がおかしいのか教えて頂けませんか。 | ||||||||||||||||||||
|
投稿日時: 2005-10-05 17:52
お世話になります。
テスト的に子フォームをコピーしてフォームを増やしてチェックしました。 基本的に起動する・落とすの動作を繰り返します。(複数画面同時起動は行いません) 新しいフォームが起動する度に約2M程度増えていきます。 既に一度でも起動されたフォームを起動するとメモリに変化はありませんでした。 | ||||||||||||||||||||
|
投稿日時: 2005-10-05 17:55
こんにちは。
全世代のガベージコレクションを実行したとしても、管理ヒープに解放しているだけで、必ずしも OS に返しているとは限らないのでは? | ||||||||||||||||||||
|
投稿日時: 2005-10-05 21:53
むか〜〜〜し、
「ギガ近くまで確保してるけど、本当に大丈夫かよ?!」 って、ここに書いた記憶があります(^◇^ 「そんなもんです」 って、返答されたように、覚えています。。。
だったら Form で受ければいいのでは?
IDisposable インターフェイスを実装するクラスのインスタンスを、使い終わったら Dispose メソッドをコールします。 Form.Close メソッドは、Dispose メソッドの別名として機能します(ちと、注意が必要)。ですから、Closed イベントで、わざわざ Dispose する必要も、GC.Collect する必要もありません。詳細は、MSDN を読んでください。 わからなかった場合は、どのあたりがわからなかったか、教えてください。FeedBack のネタにしますので。 _____________________________________________________________________________ □ Posted by Jitta on 2005/10/05 □ じったのノート □ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ |