Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Событие по смене даты


Автор: Experimenter 8.5.2007, 22:39
Уважаемые! Недавно возник такой вопрос: как в си-шарпе (win-сервис) вызвать событие при наступлении 0 часов 0 минут. То есть не проверяя ежесекундно (ежеминутно, ежечасно) сколько сейчас времени, а поставить флаг на это время и ждать... Или я уже заработался слишком и это невозможно в принципе?

Автор: Ch0bits 9.5.2007, 09:44
Нет.
Может быть только как-нибудь задействовать виндовый планировщик? (например чтобы тот запускал команду, которая будет дёргать твой сервис)  smile 

Автор: sgrey 9.5.2007, 22:14
можно конечно... в таймер записать чтобы он проверял время и если часы = 00 и минуты = 00, то запускай такой-то процесс
вот я для проверки сделал простое отображение времмени на лэйбле
Код

private void timer1_Tick(object sender, EventArgs e)
        {
            if (DateTime.Now.Hour == 15 && DateTime.Now.Minute == 14)
           {
                lblTime.Text = DateTime.Now.ToString();
           }
        }

только программа естественно должна быть включена... или можно просто отдельно написать процесс который будет запускать основную прогу в полночь

Автор: Retro 9.5.2007, 22:31
Цитата(sgrey @  9.5.2007,  21:14 Найти цитируемый пост)
или можно просто отдельно написать процесс который будет запускать основную прогу в полночь

Как по мне это более рационально.

Автор: sgrey 9.5.2007, 22:40
Цитата(Retro @ 9.5.2007,  22:31)
Как по мне это более рационально.

ну тут ещё зависит от того что конкретно нужно и какая прога... может она в любом случае будет работать, тогда и в неё вписать можно

Автор: Retro 9.5.2007, 22:48
Цитата(sgrey @  9.5.2007,  21:40 Найти цитируемый пост)
ну тут ещё зависит от того что конкретно нужно и какая прога... может она в любом случае будет работать, тогда и в неё вписать можно 

Это понятно, но если все, что нужно это вызвать событие по времени, то маленький процессик в памяти это, ИМХО, именно то, что нужно.

Автор: sgrey 9.5.2007, 22:51
Цитата(Retro @ 9.5.2007,  22:48)
Это понятно, но если все, что нужно это вызвать событие по времени, то маленький процессик в памяти это, ИМХО, именно то, что нужно.

согласен  smile 

кстати ещё шаг можно сделать минуту, а то он каждую милисекунду проверяет условие )) 

Автор: Retro 9.5.2007, 23:00
Цитата(sgrey @  9.5.2007,  21:51 Найти цитируемый пост)
кстати ещё шаг можно сделать минуту, а то он каждую милисекунду проверяет условие ))  

Ну да, тут конечным условием является - минимальная нагрузка.

Автор: archeg 9.5.2007, 23:55
Цитата(sgrey @ 9.5.2007,  22:51)

кстати ещё шаг можно сделать минуту, а то он каждую милисекунду проверяет условие ))


Зачем минуту? Можно определить такой шаг, чтобы он сработал сразу тогда когда нужно.

Код

            DateTime t = DateTime.Now;
            DateTime resultTime = new DateTime(t.Year, t.Month, t.Day + 1, 0, 0, 0, 0); //Тут еще проверку календаря желательно
                        
            FarTimer = new Timer();
            TimeSpan span = resultTime - t;
            FarTimer.Interval = (int) span.TotalMilliseconds;
            FarTimer.Tick += new EventHandler(FarTimer_Tick);
            FarTimer.Start();


Если результирующее время отличаеться от текущего больше чем на 9 дней - то прийдеться делить на кусочки (по 9 дней) - может быть переполнение типа int

Автор: sgrey 10.5.2007, 00:17
Цитата(archeg @ 9.5.2007,  23:55)
Зачем минуту? Можно определить такой шаг, чтобы он сработал сразу тогда когда нужно.

Код

            DateTime t = DateTime.Now;
            DateTime resultTime = new DateTime(t.Year, t.Month, t.Day + 1, 0, 0, 0, 0); //Тут еще проверку календаря желательно
                        
            FarTimer = new Timer();
            TimeSpan span = resultTime - t;
            FarTimer.Interval = (int) span.TotalMilliseconds;
            FarTimer.Tick += new EventHandler(FarTimer_Tick);
            FarTimer.Start();


Если результирующее время отличаеться от текущего больше чем на 9 дней - то прийдеться делить на кусочки (по 9 дней) - может быть переполнение типа int

ну да, я сначала написал а потом подумал - зачем минуту, когда нам нужно только в полночь активировать? ))
как раз хотел исправлять )

Автор: Experimenter 10.5.2007, 11:01
Да, все правильно, только я забыл еще добавить, что событие должно возникать каждую полночь. Первый раз оно возникнет, а потом... Если вдруг понадобится Вин-сервис перезапустить, тогда как быть??? Возможно, наверное, так: при запуске сервиса 
Код

TimeSpan span = resultTime - DateTime.Now;
 при первом и последующих возникновениях события TimeSpan span будет равен целым суткам. Да, выглядит логично. Всем спасибо, если не будет других соображений, то через сутки закрою вопрос.

Автор: Experimenter 12.5.2007, 21:19
Да, тема закрыта

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)