- - PR -
【C#】System.Windows.Forms.Timerについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-01-25 08:16
お世話になります。
System.Windows.Forms.Timerのオブジェクト破棄についてご教授ください。 現在、MSDNのサンプルコードを元にタイマを利用したプログラムを書いています。 内容は、VSのIDE画面で、「ツールボックス」や、「ソリューションエクスプローラ」など を表示させる時に、各エリアにマウスポインタを乗せると、各メニューがスライド表示されます。 あれと同じような事をしようと思い、MSDNでSystem.Windows.Forms.Timerを調べ、 ほぼ期待通りの動きをする事ができるようになりました。 しかし、Timerでメモリを無駄遣いしているようです。 実際に、フォームを表示させた後、タスクマネージャのプロセスタブを表示させて確認しましたところ、 @エリアにマウスポインタを載せる。 Aパネルが左から右にスライド表示する。 Bパネルエリアからマウスポインタを外す。(パネル見えなくする) この流れの@〜Bを行う度に大体16Kbyteずつ、メモリ使用量が無限に増えていってしまいます。 そこで以下のコードの、コメントを入れた部位をコメントの通りに変更してみました。 // (1) privateからstaticに変更 static System.Windows.Forms.Timer myPanelTimer = new System.Windows.Forms.Timer(); private void PanelTimerEventProcessor(Object myObject, EventArgs myEventArgs) { myPanelTimer.Stop(); if (this.panel1.Left != this.panel2.Right +1 ) { this.panel1.Left += 20; myPanelTimer.Enabled = true; } else { PanelexitFlag = true; // (2) タイマオブジェクトの破棄 myPanelTimer.Dispose(); } } (1)はこのコードは以前、 private System.Windows.Forms.Timer myPanelTimer = new System.Windows.Forms.Timer(); となっていました。この変更で無限に増えてしまうメモリは約8kbyteになりました。 (2)はタイマオブジェクトが残ったままだからメモリが増え続けてしまうのだと思い、 タイマイベントが終了する時にタイマオブジェクトをDisposeしてみました。 これでメモリの増える量は、4kbyte減りました。 が、4kbyteでも増えていってしまうのは困るので、 他に色々と考えられるところを見てみたのですが、私にはわかりませんでした。 そこで、何かヒントだけでもいただければと思い、質問させていただきました。 お忙しいところすみません、何卒よろしくお願いいたします。 追伸 以下はパネル2にマウスカーソルが入った事を知らせるイベントです。 このイベント内で、タイマイベントをスタートさせています。 private void panel2_MouseEnter(object sender, System.EventArgs e) { // if ( this.panel1.Right == 0 ) // { // Sets the timer interval to 5 seconds. myPanelTimer.Interval = 3; myPanelTimer.Start(); // Runs the timer, and raises the event. while(PanelexitFlag == false) { // Processes all the events in the queue. Application.DoEvents(); } // } } |
|
投稿日時: 2006-01-25 09:05
ガベージ コレクション がすぐに回収してくれるとは限りません。
GC.Collect しているわけじゃないのですから。(お勧めしない) 適宜回収してくれるので、きっちり Dispose しておけば問題ないです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
|
投稿日時: 2006-01-25 21:15
じゃんぬねっとさん、
アドバイスありがとうございます。 適宜回収してくれるという事で、安心しました。 お手数をお掛けして申し訳ございませんでした。 また、何かございましたら何卒よろしくお願いいたします。 |
1