- PR -

C# timerを使わず任意の時刻にイベントを発生させる方法

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-08-23 19:09
例えば、毎朝午前9時にイベントを発生させるにはどうすれば良いでしょうか?
確かにtimer系のクラスを使って一定周期で現在時刻を取得し、午前9時になったら
イベントを発生させるというのも一つの解決です。しかし、この方法だと、200msec以内にイベントを発生させたい場合は、監視のために常時200msec周期でタイマーイベントを発生させる必要があり、効率的でありません。監視のためのイベントを必要としない解決方法はありますか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-23 19:28
引用:

ひろしさんの書き込み (2007-08-23 19:09) より:

しかし、この方法だと、200msec以内にイベントを発生させたい場合は、監視のために常時200msec周期でタイマーイベントを発生させる必要があり効率的でありません。


ある時刻に処理を行いたい。 だから時刻を監視したい。 監視させるためには定期的に 「監視処理」 を実行する必要がある。 だけどそれを定期的に実行したくない。 こう仰っているわけですね。 この方法のどのあたりが "効率的でない" のでしょう?

そのアプリケーション起動時に 1 回だけ 09:00 までの差分を取り、その差分の時間が経過した後に何かをドリブンするという方法も考えられるとは思いますが、一般的ではないと思います。

Windows であればタスク スケジューラを利用した方が賢明ではないでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-08-23 19:48
引用:

じゃんぬねっとさんの書き込み (2007-08-23 19:28) より:
Windows であればタスク スケジューラを利用した方が賢明ではないでしょうか。



私もそう思います。
負荷という意味ではタスクスケジューラが一番小さいので、
1日1回ならタスクスケジューラでやるべきですね。

引用:

ひろしさんの書き込み (2007-08-23 19:09) より:
しかし、この方法だと、200msec以内にイベントを発生させたい場合は、監視のために常時200msec周期でタイマーイベントを発生させる必要があり、効率的でありません。



200msec以内の精度で、っていうがどの位クリティカルによりますが、
普通に使ってるPCだと200msecぐらいの遅延は普通に発生しますね。

そもそも、
>監視のために常時200msec周期でタイマーイベントを発生させる必要があり、効率的でありません。
そんなことないでしょう。
明日のドラマの最初の10秒が見たいからって、
今日から10秒おきにテレビをみる必要はないですよ。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-08-26 00:01
回答ありがとうございます。
タスクスケジューラを使って解決しました。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-08-26 10:47
引用:

ひろしさんの書き込み (2007-08-23 19:09) より:
しかし、この方法だと、200msec以内にイベントを発生させたい場合は、監視のために常時200msec周期でタイマーイベントを発生させる必要があり、効率的でありません。監視のためのイベントを必要としない解決方法はありますか?


おそらく、午前9時までという長いタイマーは、誤差が大きくて、200msecという短いタイマーは誤差が少ない、という仮定を持たれているのでは?と推測します。(これ以外に200msecのタイマーを必要とする理由が思い浮かびません。)

しかし、Windows のタイマーにはそのようなことはなく、何時間のタイマーであろうが200msecのタイマーであろうが誤差は一緒だと思います。
だから、午前9時までというタイマーを仕掛けさえすれば良く、200msecのタイマーを仕掛けるのは無駄です。タイマーに精度を必要とする理由が、それだけの処理精度を要求するのならば分かりますが、たとえば午前8時59分59秒999ms に発動すると、午前9時前なので、ロジックがうまく動かないというような理由ならば、ロジックのほうを直すべきでしょう。たとえば時刻の比較方法を変えたり、あるいは、午前8時59分59秒999msに発動したら、短時間スリープして、午前9時を経過するまで待つようにするなどです。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
1

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