- 題名: DoEventsでメモリリーク?
- 日時: 2005/01/11 14:11:53
- ID: 8323
- この記事の返信元:
- (なし)
- この記事への返信:
- [8329] Re[1]: DoEventsでメモリリーク?2005/01/11 15:51:16
- [8340] Re[1]: DoEventsでメモリリーク?2005/01/11 16:47:29
- ツリーを表示
こんにちは、じゃんぬねっと です。 ■No8329に返信(Mooさんの記事) > この関数ではなく、 > Thread.Sleep メソッド ではだめですか? では、描画はどうしましょうか? (w ■No8323に返信(そーですねぃさんの記事) > 本関数は他アプリとの通信の間、 > レスポンス待機中にユーザインタフェースが > 使用不能にならないために準備している関数です。 > また、上記の関数は500ms周期で継続的に呼び出しています。 とありますよ。 ちなみにこの現象、ソース抜粋部分が問題なのではなく (Long (Int64) ではなく、Integer (Int32) だろという突っ込みはありますが) > また、上記の関数は500ms周期で継続的に呼び出しています。 ここで、スレッドを使っているのが問題かなと思いました。 私の環境だとメモリリークなどしませんでしたから。 /*************************************************** * @Homepage http://f57.aaa.livedoor.jp/~jeanne/ * @Blog http://www.ailight.jp/blog/jeanne/ ***************************************************/
こんにちは、じゃんぬねっと です。 ■No8335に返信(Mooさんの記事) > すみません、 > 私の書き込みがスレッドセーフじゃなかったようです。 Moo さん、ごめんなさい。 新たにインスタンスを生成 (修正) するとスレッドセーフではなくなりますから、 掲示板への書き込みは static (静的) にしないといけませんね (^-^A) ■No8323に返信(そーですねぃさんの記事) 蛇足になりますが、 > また、上記の関数は500ms周期で継続的に呼び出しています。 これは、500ms 周期で指定された秒間、"ずっと" Windows メッセージを受け付けてますよね。 そうではなくて、500ms 周期で 1 度だけ実行して、Windows メッセージを処理するべきでは? 後は、先の投稿で言った通り、メインスレッド側はどうなってるのかが問題かと。 /*************************************************** * @Homepage http://f57.aaa.livedoor.jp/~jeanne/ * @Blog http://www.ailight.jp/blog/jeanne/ ***************************************************/
分類:[.NET]
VB.NET 2003でWindowsアプリを作成しています。
長時間運用していると利用可能な物理メモリが減少していくようで(タスク
マネージャにて確認)、最終的にはアプリケーションの操作が不能となりま
す。
DevPartnerStudioというツールにてメモリリークを調査したところ、
Public Sub Wait(ByVal TT As Long)
' TTミリ秒間Waitする。
Dim T1 As Long, T2 As Long
T1 = System.Environment.TickCount
Do Until T2 - T1 >= TT
T2 = System.Environment.TickCount
System.Windows.Forms.Application.DoEvents()
Loop
End Sub
という関数のDoEventsにてメモリリークしているとの解析結果になりました。
本関数は他アプリとの通信の間、レスポンス待機中にユーザインタフェース
が使用不能にならないために準備している関数です。また、上記の関数は500
mS周期で継続的に呼び出しています。
ガベージコレクタは適宜起動されるため、上記のようなケースでメモリリーク
するようなことはないと考えていましたが、何か間違えがありますでしょうか。
どうか御教示願います。