0

システム クロックで 1 時間が経過するたびにイベントを発生させたいと考えています。たとえば、午前 7 時 45 分にプログラムを実行すると、イベントは午前 8 時 45 分ではなく午前 8 時に発生するはずです。午前 8:00 にイベントが発生した後、このイベントは午前 9:00、午前 10:00、午前 11:00 などの毎時間発生する必要があります。

誰でもコードを表示するのを手伝ってもらえますか...私はC#.netを使用しています...よろしくお願いします...

アップデート:

これで、質問に対する簡単な解決策が得られました。したがって、このソリューションを共有したいと思います。lboshuizenの答えはすでに正しいです。私の答えは、lboshuizenの答えと同じロジックですが、より詳細で正確です。

まず、Timer を使用する必要があります。タイマーは基本的にミリ秒単位で動作し、追加の計算が必要になる場合があります。そこで、まずはミリ秒から分の整形機能を実装したいと思います。

int CalculateMillisecondUntilNextHour()
{
     int REMAIN_MINUTE = 60 - DateTime.Now.Minute;
     DateTime now = DateTime.Now;
     DateTime nexthour = now.AddMinutes((minute)).AddSeconds(now.Second * -1).AddMilliseconds(now.Millisecond * -1);

     TimeSpan interval = nexthour - now;
     return (int)interval.TotalMilliseconds;
}

void CheckEachHourPassed()
{
     System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
     t.Interval = CalculateMillisecondUntilNextHour();
     t.Tick += new EventHandler(t_Tick);
     t.Enabled = true;
}

void t_Tick(object sender, EventArgs e)
{
     MessageBox.Show("Raise Your Event");
     t.Interval = CalculateTimerInterval(REMAIN_MINUTE);
}

ここで、主な作業関数は CheckEachHourPassed() です。イベント スケジューラを開始する場所でこの関数を呼び出します。

4

3 に答える 3

0

プロパティTimerを固定して使用できますInterval

リンク: http: //msdn.microsoft.com/fr-fr/library/system.timers.timer.aspx

于 2012-10-12T14:48:16.110 に答える
0

疑似コード (実装は読者の練習問題として残されています)

var currentTime = Time.Now()
var deltaMinutes  = Calculate_minutes_till_next_full_hour(currentTime);
wait(deltaMinutes);
var timer = new timer();
timer.Every().Minutes(60).Execute(() => Code());
于 2012-10-12T14:59:37.110 に答える
0

問題は、

timer.Every().Minutes(60).Execute(() => Code());

時間の経過とともに、実際にはリアルタイムと同期しなくなる可能性があります。

これをスレッドで実行するのはどうですか

var lastMoment = DateTime.Now;
while(true)
   if(DateTime.Now.Hour != lastMoment.Hour)
   {
       //Raise ElaspedHourEvent
       //Thread.Sleep(1000);
   ]

正時からせいぜい 1 秒後までイベントが発生しない可能性がありますが、少なくとも同期が外れることはありません。

于 2013-03-03T21:01:12.347 に答える