Точно срабатывание тика по окончании часа в C # Timer - PullRequest
4 голосов
/ 26 ноября 2010

Я хочу, чтобы событие галочки срабатывало каждый час точно по завершении часа.Например, отметьте 8 am, затем 9 am, затем 10 am и т. Д. Просто, мне нужно установить Interval на 3600000.

Проблема в том, как мне определить, когда следует запустить таймер?Я создаю инструмент, который будет запускаться в системном трее с момента входа пользователя в систему.

Ответы [ 5 ]

10 голосов
/ 26 ноября 2010

Пожалуйста, не создавайте программу, которая только истратит память. Для этого и предназначен планировщик задач Windows. Запускайте вашу программу каждый час от такой задачи.

http://msdn.microsoft.com/en-us/library/aa384006%28v=VS.85%29.aspx

Вот пример:

  • Перейдите в Пуск-> Программы-> Стандартные-> Запланированные задачи.
  • В правой части нажмите «Добавить задачу ..».
  • Выберите ваш исполняемый файл.
  • Перейдите на вкладку Триггер.
  • Создать триггер со следующим выбором:

.

Run Daily 
Start today at 8:00 am
Repeat every 1 Hour

Извините, что не могу предоставить скриншоты, так как я использую немецкую версию Windows 7.

4 голосов
/ 26 ноября 2010

Может быть, ниже код неисправен, но идея такова:

    public void InitTimer()
    {
        DateTime time = DateTime.Now;
        int second = time.Second;
        int minute = time.Minute;
        if (second != 0)
        {
            minute = minute > 0 ? minute-- : 59;
        }

        if (minute == 0 && second == 0)
        {
            // DoAction: in this function also set your timer interval to 3600000
        }
        else
        {
            TimeSpan span = new TimeSpan(0, 60 - minute, 60 - second);
            timer.Interval = (int) span.TotalMilliseconds - 100; 
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
        }
    }

    void timer_Tick(object sender, EventArgs e)
    {
        timer.Interval = 3600000;
        // DoAction
    }

Редактировать: , как предложил @smirkingman, я удалил несколько миллисекунд из-за задержки запуска проектаи запуск этого приложения: timer.Interval = (int) span.TotalMilliseconds - 100;

1 голос
/ 25 июля 2011

Вот как я это сделал. Событие Tick срабатывает каждые 20 секунд. Просто измените минуты == "xxx" на любое время, когда вы хотите, чтобы событие сработало. Если вам нужно, чтобы события распределялись по часам, просто увеличьте интервал таймера. Просто и эффективно.

private void timer1_Tick(object sender, EventArgs e)
    {
      DateTime Time = DateTime.Now;
          int minutes = Time.Minute;

            if (minutes == 00)  //FIRE ON THE HOUR
                { DO THIS  }

            if (minutes == 15)  //FIRE ON 1/4 HOUR
                {  DO THIS }

            if (minutes == 30)  //FIRE ON 1/2 HOUR
                { DO THIS }

            if (minutes == 45)  //FIRE ON 3/4 HOUR
                { DO THIS }
    }
1 голос
/ 26 ноября 2010

Я думаю, что может быть проще, если вы установите таймер каждую, скажем, минуту, и этот таймер может проверять системные часы, когда желаемое время меньше или равно системному времени, вы можете просто выполнить действия (вэтот пример с ошибкой не более 1 минуты)

Вы можете улучшить ее, сделав интервал таймера dinamyc, например, если вы проверите время и осталось еще полчаса, вы можете установить интервал на 15 минутВ следующий раз вы уменьшите его до 5 минут и т. д., пока вы не проверяете время раз в секунду, например.

HTH

0 голосов
/ 26 ноября 2010

Вместо того, чтобы запускать таймер один раз в час, возможно, было бы более уместно запускать таймер один раз в минуту и ​​проверять, не пришло ли время.отставание составляет 59 секунд.Если вам нужно, чтобы он стрелял точно в час (ровно в 10 часов утра), вам, возможно, придется в первый раз поиграть с интервалом, чтобы выстроиться в линию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...