DOBON.NET DOBON.NETプログラミング掲示板過去ログ

指定した時間に処理をしたい

環境/言語:[VS2010]
分類:[.NET]

VB.NETで、指定した時間になったら処理を実行させるには、
どのようにすればよいのでしょうか。

今はTimerでFormat(Now(), "HH:mm:ss") = "09:00:00"
などとしていますが精度がイマイチなのか実行されない時があるのです。
よろしくお願いします。
フレアーさんこんにちは、おのでらです。

> 今はTimerでFormat(Now(), "HH:mm:ss") = "09:00:00"
> などとしていますが精度がイマイチなのか実行されない時があるのです。

イメージとして書きますが、
実行済みフラグを1個持って

Format(Now(), "HH:mm:ss") >= "09:00:00"

のような条件にして、条件を満たしたらフラグを true にするようなイメージでしょうか。

文字列との比較部分と日付をまたいだときなど、もうちょっと考えるところはありますが。
■No31310に返信(フレアーさんの記事)
> VB.NETで、指定した時間になったら処理を実行させるには、
> どのようにすればよいのでしょうか。
>
> 今はTimerでFormat(Now(), "HH:mm:ss") = "09:00:00"
> などとしていますが精度がイマイチなのか実行されない時があるのです。
> よろしくお願いします。

VB.NET には処理したい内容だけ実装し、タスク スケジューラと組み合わせたほうが無難かと。
返信ありがとうございます。

言葉足らずで済みません。
フラグは持っておらず、日に1度だけ決まった時間に実行させたいだけです。

先ほどタイマーで
Diagnostics.Debug.WriteLine(Format(Now(), "HH:mm:ss"))
とだけ記述したものを実行したところ、
1分に1度くらいの頻度で出力されない秒が発生しました。

"09:00:00"を受け取りたいので、タイマーのintervalを1000で設定していたのですが、
これを990に設定したところ、秒数が飛ぶことはなくなったように見えます。
また、950の場合だと、同じ秒数が2度出力されることがあることもわかりました。
タイマーは、こういう仕様なのでしょうか。
それとも、FormatやNowの部分でラグが生じてしまったのでしょうか。

タスクスケジューラは使用したことがありませんが、
引数を受け取ることができるようですし検討したいと思います。

ありがとうございます。
少なくとも、タイマーの使い方が間違っているように思います。
お使いのTimerがどの名前空間のTimerを指しているのかは分かりませんが、
条件式で時間を判定しなければならないことはありません。

どのような用途かは分かりませんが、指定した時間にバッチ処理を行うのでしたら、
他の人の指摘のように、Windowsのタスクスケジューラを使った方がいいような気がします。
(ただし、スケジュール設定はそのソフトを動かすユーザーが行うことになります。)
2013/02/05(Tue) 23:04:53 編集(投稿者)

■No31313に返信(フレアーさんの記事)
> 先ほどタイマーで
> Diagnostics.Debug.WriteLine(Format(Now(), "HH:mm:ss"))
> とだけ記述したものを実行したところ、
> 1分に1度くらいの頻度で出力されない秒が発生しました。

そういうものです。
System.Windows.Forms.Timer は指定した Interval ”以上”経過したときにイベントが呼び出されますので、1 秒ごとに呼び出される保障はありませんので、上記のように特定の秒が飛ぶことは十分に考えられます。
他のタイマーでも発生確率の差はあれど、Interval 以上の時間が経過してしまうことは可能性として考えないといけません。
(他のプロセスの負荷であるとか、サービスの負荷であるとか、ウィルス対策ソフトのアイドルスキャンであるとか、周期的な呼び出しを妨げる要素は多数あります)

どのタイマーであれ、正確な Interval にならないことがあるという想定でロジックを作るべきです。

# もっとも、タスクスケジューラが有力案なのは変わりませんが。
> System.Windows.Forms.Timer は指定した Interval ”以上”経過したときにイベントが呼び出されますので、1 秒ごとに呼び出される保障はありませんので、上記のように特定の秒が飛ぶことは十分に考えられます。

そうなんですね。Timerのことを誤認識していました。

> 他のタイマーでも発生確率の差はあれど、Interval 以上の時間が経過してしまうことは可能性として考えないといけません。
> (他のプロセスの負荷であるとか、サービスの負荷であるとか、ウィルス対策ソフトのアイドルスキャンであるとか、周期的な呼び出しを妨げる要素は多数あります)
>
> どのタイマーであれ、正確な Interval にならないことがあるという想定でロジックを作るべきです。

勉強になりました。今後は考慮します。

> タスクスケジューラ

指定した時間に処理を実行させたい場合は、プログラム上で行うよりもタスクスケジューラの方が向いていそうですね。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板