Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/75: Рейтинг темы: голосов - 75, средняя оценка - 4.81
 Аватар для FreeZon
8 / 10 / 8
Регистрация: 30.12.2013
Сообщений: 577
.NET 4.x

Таймер обратного отсчета и вывод в Label времени в формате чч:мм:сс

26.01.2015, 21:40. Показов 15491. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите реализовать. У меня есть таймер в 3 часа (10800000 ms)
Мне нужно чтобы этот отсчет выводил в лабейл время оставшиеся например: 3:00:00 через секунду 2:59:59 еще через сек 2:59:58 и так далее. Пока не дойдет до 0:00:00 и если все по нулям выполняем блок кода.
Свой вариант кода я даже показывать не буду позориться. Помогите сделать ото я даже не понимаю как это сделать.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2015, 21:40
Ответы с готовыми решениями:

Таймер обратного отсчета в формате чч:мм:сс
Мой таймер считает минуты и секунды. Подскажите, как добавить чтобы считало количество часов. И еще проблемка, как его остановить-то?)))...

Таймер обратного отсчета для теста (Label)
На форуме очень много вопросов есть сразу извиняюсь! Я нашел код правда я думаю что нужно делать в потоке чтобы он работал, а я еще не...

Таймер обратного отсчета времени
Всем привет если кто может помогите написать программу таймер отсчета времени с 5 мин до 0 и ежесекундным выводом на экран. Нашел для ВБА,...

14
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.01.2015, 22:01
Что-то в таком духе:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Timers;
 
class Program
{
    static void Main()
    {
        using (var timer = new MyTimer(TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(1)))
        {
            timer.Tick += (sender, span) => Console.WriteLine(span);
            timer.Start();
            Console.ReadKey();
        }
    }
}
 
 
 
internal class MyTimer : IDisposable
{
    public event EventHandler<TimeSpan> Tick = delegate { };
    public TimeSpan Max { get; private set; }
    public TimeSpan Interval { get; private set; }
    private Timer _timer;
 
    public MyTimer(TimeSpan max, TimeSpan interval)
    {
        Max = max;
        Interval = interval;
        _timer = new Timer(Interval.TotalMilliseconds);
        _timer.Elapsed += (sender, args) =>
        {
            Max -= Interval;
            Tick(this, Max);
        };
    }
 
    public void Start()
    {
        _timer.Start();
    }
 
    public void Stop()
    {
        _timer.Stop();
    }
 
    public void Dispose()
    {
        if (IsDisposed)
            throw new ObjectDisposedException("MyTimer");
        lock (_timer)
            if (!IsDisposed)
            {
                _timer.Stop();
                _timer = null;
            }
    }
 
    public bool IsDisposed
    {
        get { return _timer == null; }
    }
}
0
 Аватар для FreeZon
8 / 10 / 8
Регистрация: 30.12.2013
Сообщений: 577
26.01.2015, 22:01  [ТС]
Таймер с интервалом в 1 ms:
C# Скопировано
1
2
3
4
5
interval--;
            int hour = interval / 1000 / 60 / 60;
            int min = (interval / 1000 / 60) / (10800000 / 1000 / 60 / 60);
            int sec = interval / 1000 / (10800000 / 1000 / 60);
            label1.Text = hour + ":" + min + ":" + sec;
Но у меня похоже что-то с расчетами не верно...
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.01.2015, 22:03
Точнее так:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Timers;
 
class Program
{
    static void Main()
    {
        using (var timer = new MyTimer(TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(1)))
        {
            timer.Tick += (sender, span) => Console.WriteLine(span);
            timer.Start();
            Console.ReadKey();
        }
    }
}
 
 
 
internal class MyTimer : IDisposable
{
    public event EventHandler<TimeSpan> Tick = delegate { };
    public TimeSpan Max { get; private set; }
    public TimeSpan Interval { get; private set; }
    private Timer _timer;
 
    public MyTimer(TimeSpan max, TimeSpan interval)
    {
        Max = max;
        Interval = interval;
        _timer = new Timer(Interval.TotalMilliseconds);
        _timer.Elapsed += (sender, args) => OnTick();
    }
 
    private void OnTick()
    {
        Tick(this, Max);
        Max -= Interval;
    }
 
    public void Start()
    {
        OnTick();
        _timer.Start();
    }
 
    public void Stop()
    {
        _timer.Stop();
    }
 
    public void Dispose()
    {
        if (IsDisposed)
            throw new ObjectDisposedException("MyTimer");
        lock (_timer)
            if (!IsDisposed)
            {
                _timer.Stop();
                _timer = null;
            }
    }
 
    public bool IsDisposed
    {
        get { return _timer == null; }
    }
}
2
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.01.2015, 22:09
Лучший ответ Сообщение было отмечено FreeZon как решение

Решение

Цитата Сообщение от FreeZon Посмотреть сообщение
я даже не понимаю как это сделать.
К примеру так. Форма, кнопка и лейбл.
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
27
28
29
30
31
32
33
34
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication4 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            button1.Click += button1_Click;
        }
 
        void button1_Click(object sender, EventArgs e) {
            StartTimer();
        }
        void StartTimer() {
            TimeSpan ts = new TimeSpan(3, 0, 0);
            Task.Factory.StartNew(() => {
                while (ts.Hours!=0) { 
                    label1.Invoke((Action)(() => { label1.Text = ts.ToString(); }));
                    Thread.Sleep(1000);
                    ts = ts.Subtract(new TimeSpan(0, 0, 1));
                }
                //Тут ставим действие по окончании таймера.
            });
        }
    }
}
Добавлено через 1 минуту
Psilon, как-то много букафф для такой простой задачи.
2
 Аватар для chumich
2081 / 1239 / 464
Регистрация: 20.12.2014
Сообщений: 3,237
26.01.2015, 22:13
Посмотрите, может подойдет :
Обратный отсчет времени в формате "H:mm:ss"
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.01.2015, 23:06
insite2012, хз, предпочитаю один раз решать задачу и потом пользоваться готовым решением, а наследовать в терминах ущербно-ориентированного программирования - не моё
0
5 / 5 / 2
Регистрация: 13.10.2015
Сообщений: 407
16.05.2016, 16:11
А если например надо отсчет от 1,0,0 или вообще 0,1,0 то как быть?
0
 Аватар для rudeuk
6 / 4 / 2
Регистрация: 24.11.2019
Сообщений: 26
25.11.2019, 17:29
insite2012, как сделать так, чтобы при открытии формы TestForm
начался отсчет 15:00:59 15:00:58 и т.д. чтобы это отображалось в label2
и когда 15 мин. вышли, то форма просто закрылась автоматически.

Запускать таймер должна форма TestForm

Ваш код:

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
27
28
29
30
31
32
33
34
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication4 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            button1.Click += button1_Click;
        }
 
        void button1_Click(object sender, EventArgs e) {
            StartTimer();
        }
        void StartTimer() {
            TimeSpan ts = new TimeSpan(3, 0, 0);
            Task.Factory.StartNew(() => {
                while (ts.Hours!=0) { 
                    label1.Invoke((Action)(() => { label1.Text = ts.ToString(); }));
                    Thread.Sleep(1000);
                    ts = ts.Subtract(new TimeSpan(0, 0, 1));
                }
                //Тут ставим действие по окончании таймера.
            });
        }
    }
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.11.2019, 18:14
Что-то в таком духе:

C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace WindowsFormsApplication4 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            Task.Run(() => StartTimer());
        }
 
        async void StartTimer() {
            TimeSpan ts = new TimeSpan(0, 15, 0);
            while (ts > TimeSpan.Zero) {
                label1.Invoke((Action)(() => { label1.Text = ts.ToString(); }));
                await Task.Delay(1000);
            }
            Close();
        }
    }
}
1
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.11.2019, 18:19
Цитата Сообщение от rudeuk Посмотреть сообщение
как сделать так
Коллега Psilon показал вам пример. Сам я, к сожалению, уже постепенно отхожу от дотнета, перешел на C++/Qt.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.11.2019, 18:24
Лол, не могу отредактировать сообщение. Смищно.

Вот такой вариант у меня отработал

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
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
            Load += (sender, args) => Task.Run(StartTimer);
        }
 
        private async void StartTimer() {
            TimeSpan ts = new TimeSpan(0, 15, 0);
            while (ts > TimeSpan.Zero) {
                label1.Invoke((Action)(() => { label1.Text = ts.ToString(); }));
                await Task.Delay(1000);
                ts -= TimeSpan.FromSeconds(1);
            }
            Close();
        }
    }
}
постепенно отхожу от дотнета, перешел на C++/Qt.
Какой ужас
1
 Аватар для rudeuk
6 / 4 / 2
Регистрация: 24.11.2019
Сообщений: 26
25.11.2019, 18:26
Psilon, не работает. просто висит 0:15:0 и всё.
не идет обратного отсчета, и форма не закрывается.
скомпилировалось без ошибок.


C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace project
{
    public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();
            Task.Run(() => StartTimer());
        }
 
        async void StartTimer()
        {
            TimeSpan ts = new TimeSpan(0, 15, 0);
            while (ts > TimeSpan.Zero)
            {
                label2.Invoke((Action)(() => { label2.Text = ts.ToString(); }));
                await Task.Delay(1000);
            }
            Close();
        }
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.11.2019, 18:32
rudeuk, все верно, я же показал примерно как будет выглядеть. Тут нет вычитания таймера же. Я потом показал итоговый вариант. Его можно подсократить и выкинуть таск ран и инвоки:

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
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
            Load += (sender, args) => StartTimer();
        }
 
        private async void StartTimer()
        {
            TimeSpan ts = new TimeSpan(0, 0, 5);
            while (ts > TimeSpan.Zero) {
                label1.Text = ts.ToString();
                await Task.Delay(1000);
                ts -= TimeSpan.FromSeconds(1);
            }
            Close();
        }
    }
}
Но это уже детали.
1
 Аватар для rudeuk
6 / 4 / 2
Регистрация: 24.11.2019
Сообщений: 26
25.11.2019, 18:36
Psilon, спасибо! всё заработало +1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2019, 18:36
Помогаю со студенческими работами здесь

Таймер обратного отсчета с редактированием времени
Здравствуйте, пробую написать код таймера на ХТМЛ и ПХП, что бы таймер допустим шел от 3 дней 12 часов и 17 сек до нуля. Но пока он...

Таймер обратного отсчета с добавлением времени когда угодно
Здарвствуйте, пробую написать код таймера на ХТМЛ и ПХП, что бы таймер допустим шел от 3 дней 12 часов и 17 сек до нуля. Но пока он...

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

Как сделать таймер обратного отсчёта с выводом оставшегося времени в поле
Не подскажите как сделать таймер обратного отсчёта с выводом оставшегося времени в поле? Я слышал что можно представить время дробными...

Таймер обратного отсчёта. Вывод TextOut
Привет форумчане) В общем нужен таймер 60,59,58,57,56... Ну это понятно, он запускается автоматически после закрытия окна hWnd2. В окне...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи с помощью арктангенса для метода обработки данных из double buffering.
Hrethgir 10.04.2025
Публикация в доработке, метод арктангенса в комментариях внизу. Вообще изначально я пренебрёг квадратурой числа, но потом понял, что для вычисления приблизительного значения - сгодится, формулу. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер