Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
21 / 10 / 5
Регистрация: 07.01.2013
Сообщений: 222
1

При выставлении времени будильника, не правильно выставляются секунды

30.05.2014, 05:20. Просмотров 546. Ответов 8
Метки нет (Все метки)


Привет, всем!

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

"Но" первое:
При выставлении времени будильника, не правильно выставляются секунды (к примеру, ставя 1 секунду, в переменную может записаться 20 секунд или другое рандмное число секунд), с часами и минутами такой проблемы нет.

вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void установитьВремяToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
 
            var dateTime = DateTime.Now;
 
            if (f2.ShowDialog() == DialogResult.OK)
            {
                dateTime1 = DateTime.Now.AddHours(Convert.ToDouble(f2.SendNum1));
                dateTime2 = DateTime.Now.AddMinutes(Convert.ToDouble(f2.SendNum2));
                dateTime3 = DateTime.Now.AddMinutes(Convert.ToDouble(f2.SendNum3));
 
                var timeSpan1 = (dateTime1 - dateTime);
                var timeSpan2 = (dateTime2 - dateTime);
                var timeSpan3 = (dateTime3 - dateTime);
 
                string s = string.Format("\r{0:00}:{1:00}:{2:00}", (int)timeSpan1.Hours, (int)timeSpan2.Minutes, (int)timeSpan3.Seconds);                
 
                alarmHours = (int)timeSpan1.Hours;
                alarmMinutes = (int)timeSpan2.Minutes;
                alarmSeconds = (int)timeSpan3.Seconds;
 
                string str = string.Format("Время для будильника выставленно на \n{0:00}:{1:00}:{2:00}", alarmHours, alarmMinutes, alarmSeconds);
                MessageBox.Show(str, "Будильник", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }            
        }
"Но" второе:
При наступлении выставленного времени (+/- рандомное число секунд из-за первого "Но"), нужное сообщение вылитает не один раз, а девять раз.
вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void Alarm()
        {
            DateTime dt = DateTime.Now;
 
            int h = dt.Hour;
            int m = dt.Minute;
            int s = dt.Second;
 
            if ((alarmHours == h) && (alarmMinutes == m) && (alarmSeconds == s))
            {
                MessageBox.Show("Оно работает!!!!", "Урааааааа");
            }
        }
Функция Alarm() находиться в обработчике события timer1_Tick.

Заранее всем спасибо за любую помощь и конструктивную критику.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2014, 05:20
Ответы с готовыми решениями:

Минуты и секунды перевести в секунды и в ISO 8601 формат времени
Добрый день/вечер/утро ув. знатоки php. Возник вопрос: time содержит в себе длительность (минуты и...

Перевод времени из минут и секунды в секунды
Всем привет! Помогите с контрольными по С++, Я пока не совсем понимаю этот язык. Заранее Спасибо!...

Диапазон времени для будильника
Добрый день, требуется например с 23:30 до 7:45 утра исполнять какое-либо действие, в остальное...

Диапазон времени для будильника
Добрый день, требуется например с 23:30 до 7:45 утра исполнять какое-либо действие, в остальное...

8
984 / 882 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
30.05.2014, 07:12 2
Аццкий Прогер, первый кусок кода спрячьте и не показывайте никому...
C#
1
2
3
4
5
6
7
8
9
10
11
            Form2 f2 = new Form2();
 
 
            if (f2.ShowDialog() == DialogResult.OK)
            {
                // alarmTime - одна переменная вместо 3-х (часы, минуты, секунды)
                alarmTime = DateTime.Now + new TimeSpan(Convert.ToInt32(f2.SendNum1), Convert.ToInt32(f2.SendNum2), Convert.ToInt32(f2.SendNum3));
 
                string str = string.Format("Время для будильника выставлено на \n{0:HH:mm:ss}", alarmTime);
                MessageBox.Show(str, "Будильник", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
Соответствующим образом поменяем и исправим тут:
C#
1
2
3
4
5
6
7
8
private void Alarm()
        {
            if (DateTime.Now >= alarmTime)
            {
                MessageBox.Show("Оно работает!!!!", "Урааааааа");
                // таймер остановить не забываем
            }
        }
1
21 / 10 / 5
Регистрация: 07.01.2013
Сообщений: 222
30.05.2014, 11:12  [ТС] 3
Цитата Сообщение от Spawn Посмотреть сообщение
if (DateTime.Now >= alarmTime)
При таком условии, сообщение вылетает при старте программы, а не при наступлении нужного времени. Думаю спасет ситуацию знак равенства "==".

Цитата Сообщение от Spawn Посмотреть сообщение
alarmTime = DateTime.Now + new TimeSpan(Convert.ToInt32(f2.SendNum1), Convert.ToInt32(f2.SendNum2), Convert.ToInt32(f2.SendNum3));
А благодаря такой форме записи, в alarmTime записывается не то время, что мы выставляем в другой форме, а вообще рандомное. Или же я делаю что то не так.
0
984 / 882 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
30.05.2014, 11:40 4
Цитата Сообщение от Аццкий Прогер Посмотреть сообщение
При таком условии, сообщение вылетает при старте программы, а не при наступлении нужного времени. Думаю спасет ситуацию знак равенства "==".
А зачем таймеру работать с начала программы?
Цитата Сообщение от Аццкий Прогер Посмотреть сообщение
А благодаря такой форме записи, в alarmTime записывается не то время, что мы выставляем в другой форме, а вообще рандомное. Или же я делаю что то не так.
Тогда объясните, что в тех трёх полях задаётся... я исходил из того, что там часы, минуты и секунды - через сколько сработать будильник должен.
0
21 / 10 / 5
Регистрация: 07.01.2013
Сообщений: 222
30.05.2014, 11:42  [ТС] 5
Цитата Сообщение от Spawn Посмотреть сообщение
А зачем таймеру работать с начала программы?
Потому что это часы с будильником.

Цитата Сообщение от Spawn Посмотреть сообщение
Тогда объясните, что в тех трёх полях задаётся... я исходил из того, что там часы, минуты и секунды - через сколько сработать будильник должен.
там три numericUpDown, которые находятся во второй форме, для выставления времени.
0
984 / 882 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
30.05.2014, 11:49 6
Цитата Сообщение от Аццкий Прогер Посмотреть сообщение
Потому что это часы с будильником.
Ок, создайте переменную - будильник задан или нет.
Цитата Сообщение от Аццкий Прогер Посмотреть сообщение
там три numericUpDown, которые находятся во второй форме, для выставления времени.
C#
1
alarmTime = DateTime.Today + new TimeSpan(Convert.ToInt32(f2.SendNum1), Convert.ToInt32(f2.SendNum2), Convert.ToInt32(f2.SendNum3));
0
21 / 10 / 5
Регистрация: 07.01.2013
Сообщений: 222
30.05.2014, 12:01  [ТС] 7
Spawn, спасибо, теперь выставляется точное время.
Но осталась еще одна недоработка.

вот код Аларма:
C#
1
2
3
4
5
6
7
8
9
10
private void Alarm()
        {
            if (DateTime.Now >= alarmTime)
            {
                MessageBox.Show("Оно работает!!!!", "Урааааааа");
                isAlarmEnabled = false;
                timer1.Stop();
            }
            timer1.Start();
        }
При достижении установленного время, мэссэдж бокс вылазит раз 30, как сделать, чтобы все таки один раз выскакивал? Или это из-за того, что таймер стоп идет после строки "isAlarmEnabled = false;" а на это нужно время, за которое и успевает вылизти столько мэссэдж боксов?
0
984 / 882 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
30.05.2014, 12:10 8
C#
1
2
3
4
5
6
7
8
        private void Alarm()
        {
            if (isAlarmEnabled && DateTime.Now >= alarmTime)
            {
                isAlarmEnabled = false;
                MessageBox.Show("Оно работает!!!!", "Урааааааа");
            }
        }
1
21 / 10 / 5
Регистрация: 07.01.2013
Сообщений: 222
30.05.2014, 12:14  [ТС] 9
Spawn, Спасибо большое. Все работает. Ушел теперь делать мелодию вместо сообщения
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2014, 12:14

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

Многозадачность в C++, обновление системного времени каждые 4 секунды при этом работа программы не останавливается
Здравствуйте, как сделать так чтобы системное время выводилось в консоль независимо от работы...

Фильтрация товаров при выставлении счета
Добрый день! Вопрос такой: Есть одна большая таблица товаров разных типов (пример: телевизоры -...

Найти вероятность того, что при двух отсчетах времени в одном секундомере будет допущена ошибка больше 0,08 секунды
Всем доброго времени суток. Очень прошу помочь с такой задачей :) : Шкала секундомера имеет цену...

При выставлении XMP профиля система не грузится
Здравствуйте, проблема у меня в том что оперативная память при выставлении XPM профиля в настроек...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.