- PR -

Timerに関して

1
投稿者投稿内容
bean
常連さん
会議室デビュー日: 2004/12/01
投稿数: 30
投稿日時: 2005-12-02 00:01
いつもお世話になっております。

Windowsサービスを作成しています。
内容はスケジューリングして、任意の処理を定期的に
行うものです。
Threading.Timerを使用して7分後、5時間後、さらには、
20日後などの設定でイベントを発生させたいのですが、
どうしても誤差が発生してしまいます。
サーバの負荷影響などを受け遅延しているのではと思いますが、
Windows標準のタスクスケジュールなどの様に、
指定した時刻にきっちりイベントを発生させる方法はないでしょうか?

ご教授お願いします。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-02 00:16
引用:

beanさんの書き込み (2005-12-02 00:01) より:

Threading.Timerを使用して7分後、5時間後、さらには、
20日後などの設定でイベントを発生させたいのですが、
どうしても誤差が発生してしまいます。


Timer は計測するために用いるのではなく、監視をするためだけに用意します。
7 分後、5 時間後、20 日後というのは、ある基準日を元にしないと定義できないものです。
つまり、現在の時刻が基準日からどれだけ経過しているかを見れば良いでしょう。
現在の時刻と基準日の差は、TimeSpan から求められます。

引用:

サーバの負荷影響などを受け遅延しているのではと思いますが、


負荷は関係ないです。
誤差があるものだというのは既知の事実です。

引用:

Windows標準のタスクスケジュールなどの様に、
指定した時刻にきっちりイベントを発生させる方法はないでしょうか?


タスク スケジューラは、まさに先の方法でやっているかと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
bean
常連さん
会議室デビュー日: 2004/12/01
投稿数: 30
投稿日時: 2005-12-02 13:47
ご回答有り難うございます。

現在の時刻と目的の時刻の差をTimeSpanに設定するのは
分かります。
例えば、本日、2005/12/02 13:48:46に
97時間11分2秒後をTimeSpanで設定すると、
Windowsの時計で2005/12/06 14:59:48に必ずイベントが発生してくれる
ということでしょうか?

また、誤差に関しましては、既知の事実とありますが、
どれくらいの誤差が発生するものなのでしょうか?

お願いします。

Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-02 14:02
こんにちは。

引用:

beanさんの書き込み (2005-12-02 13:47) より:

現在の時刻と目的の時刻の差をTimeSpanに設定するのは
分かります。
例えば、本日、2005/12/02 13:48:46に
97時間11分2秒後をTimeSpanで設定すると、
Windowsの時計で2005/12/06 14:59:48に必ずイベントが発生してくれる
ということでしょうか?




たぶん、じゃんぬねっとさんが言いたいのは

たとえばタイマーを1分毎に設定し、
タイマーイベント内で現在時刻と設定時刻を比較して(つまり監視して)
同時刻であれば、任意の処理を行えばいい

ということだと思いますよ。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-12-03 00:00
引用:

beanさんの書き込み (2005-12-02 00:01) より:

Windowsサービスを作成しています。
内容はスケジューリングして、任意の処理を定期的に
行うものです。
Threading.Timerを使用して7分後、5時間後、さらには、
20日後などの設定でイベントを発生させたいのですが、
どうしても誤差が発生してしまいます。
サーバの負荷影響などを受け遅延しているのではと思いますが、
Windows標準のタスクスケジュールなどの様に、
指定した時刻にきっちりイベントを発生させる方法はないでしょうか?




そもそも、どの程度の誤差が発生しているのでしょうか?
サーバの負荷が少ない状況でテストすれば確実に期待した結果が返ってくるものなのでしょうか?

また要求される制度はどの程度のものでしょうか?

秒単位でずれるのと分単位でずれるのとでは大違いですし
なにより、高負荷の状態の時にタイマーで割り込んで
しかも確実にその時刻に処理しなければならない処理があるとすれば
逆にその時刻にほかの処理を少し待たせるとかいろいろ考えなければならないようにも思えます。

また、ほかにもタイマーの設定時のロジックに不備があるケースも考えられます。

現在時刻をサンプリングしてから、タイマーを設定するまでの処理時間が考慮されていないと単純にその間の時間のずれが、イベントの発生する時刻のずれになることもありえます。

任意の処理ということですから、現在時刻を常に意識していないと
こういう誤差が積もり積もってずれていくことすら考えられます。

少し情報が少なすぎて、これ以上のことは思いつきません。
もっと詳しい状況や該当する部分のコードなど提示していただけると、
もっとよい方法なり、または違ったアプローチからの解決に至ったりするかもしれません。


[ メッセージ編集済み 編集者: ジブ 編集日時 2005-12-03 00:03 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-03 10:20
秒単位の精度を求めることはあまりないでしょう。
なので、1 分に 1 度の監視で十分だと思います。
負荷も少ないですし、色んな意味で合理的だと思います。

そもそも、タイマだけに頼ったスケジューリングは、
障害発生時の対応ができないと思います。

どこまで、タイマが "数えたか" をどこかに随時保存するなんてあり得ない話です。
しかし、何日後、何分後、などは 1 度保存すれば事足ります。
再起動しても関係なく正しく処理できますよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
katsum
大ベテラン
会議室デビュー日: 2002/02/27
投稿数: 119
お住まい・勤務地: 東京都
投稿日時: 2005-12-03 12:38
>内容はスケジューリングして、任意の処理を定期的に
>行うものです。
 Timerを使ったサービスをわざわざ作る必要があるのかどうかから考え直すのも一法かと。
 Windowsなら AT コマンドがありますし、Unix/Linuxなら cron もあります。

 あと経過時間をカウントする方法と、現在日時との比較による方法どちらを採るかも検討する必要があります。
 いずれも日時の手動再設定、NTPによる自動補正、再起動による経過時間のクリアといった日時・経過時間が変わるシナリオも考慮する必要があります。
 自前で作る場合も既存コマンドを使う場合も、これらのシナリオごとに調査・試験・運用手順の策定が必要となります。
 一般的に考えて、自前サービスだと既存コマンドに対して開発・保守ともに高コストになりますから、その点(予算)も含めて検討する必要があります。

#堅苦しくなりましたが言い換えるのも面倒なのでこのまま投稿します。
1

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