- PR -

CPU使用率100%を回避する方法

1
投稿者投稿内容
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-11-30 09:24
【環境】
.NET Framework1.0
VisualStadio2002
Windowsアプリケーション(C#)

上記の環境で、数秒間隔であるファイルの有無を監視する常駐アプリを開発しています。
監視についてはSystem.Windows.Forms.Timerを使用して実現していますが、
実行するとCPU使用率が常に100%になってしまいます。
Timerを使用する上でCPU使用率が100%になってしまうのはしょうがないのでしょうか?
回避策は無いでしょうか?

また、別の方法でも良いのですが、CPU使用率が常時100%にならずに
一定間隔でファイル監視する方法はないでしょうか?

以下が現在のソースになります。

static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
[STAThread]
static void Main() {
//Application.Run(new Form1());
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Interval = 10 * 1000;
myTimer.Start();
Thread.Sleep(1000);

while(ループ継続条件) {
Application.DoEvents();
}
return ;
}
private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs) {
myTimer.Stop();

〜ファイルが存在した場合の処理〜

myTimer.Enabled = true;
}


HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2006-11-30 09:32
FileSystemWatcherクラスを使用してはどうでしょうか?
Timerを使用せず、FileSystemWatcherのイベントを使用すれば解決できるかと思います。

_________________
--------------------------------------------
HIRO's.NET VB.NETとC#のTipsを掲載しています

[ メッセージ編集済み 編集者: HIRO 編集日時 2006-11-30 09:34 ]
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-11-30 09:36
昔はWin32API(FindFirstChangeNotificationとか)だったかな。.Net FrameworkだとSystem.IO.FileSystemWatcherを利用するみたいです(外していたらごめんなさい)。

http://www.ascii.co.jp/pb/msdn/article/a17_0020.html
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-11-30 09:44
引用:

村長さんの書き込み (2006-11-30 09:24) より:
Timerを使用する上でCPU使用率が100%になってしまうのはしょうがないのでしょうか?


いいえ。CPU使用率が100%になっている原因は、Timerを使っている事ではなく、以下の無限ループにあります。
コード:

while(ループ継続条件) {
Application.DoEvents();
}



引用:

回避策は無いでしょうか?


Forms.TimerはGUIアプリケーションで使用する為の機能です。GUIを持たないアプリケーションなら、System.Threading.TimerやSystem.Timers.Timerを用いたほうがシンプルに実装できるでしょう。

でも、それ以前に・・・
コード:

while(ループ継続条件)
{
Thread.Sleep(1000);
〜ファイルが存在した場合の処理〜
}


でも、良いんじゃないの?


[ メッセージ編集済み 編集者: 甕星 編集日時 2006-11-30 09:47 ]
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-11-30 10:23
皆様、回答ありがとうございます。

>shimixさん、HIROさん
自分でも継続して調べていましたが、
お二人の回答にありましたFileSystemWatcherで
CPU使用率を常時100%にせずにファイル監視できることが確認できました。

>甕星さん
そもそも使うケースが違っていたようですね。
Timerが複数あることは気づいていましたが、どれを使用しても同じだと思っていました。
お恥ずかしい。。。

皆様、ご回答ありがとうございました。
1

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