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

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

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

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

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

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

Таймер обратного отсчета времени
Всем привет если кто может помогите написать программу таймер отсчета времени с 5 мин до 0 и...

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

14
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.01.2015, 22:01 2
Что-то в таком духе:
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
8 / 10 / 8
Регистрация: 30.12.2013
Сообщений: 577
26.01.2015, 22:01  [ТС] 3
Таймер с интервалом в 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
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.01.2015, 22:03 4
Точнее так:
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
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
26.01.2015, 22:09 5
Лучший ответ Сообщение было отмечено 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
2080 / 1238 / 464
Регистрация: 20.12.2014
Сообщений: 3,237
26.01.2015, 22:13 6
Посмотрите, может подойдет :
Обратный отсчет времени в формате "H:mm:ss"
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.01.2015, 23:06 7
insite2012, хз, предпочитаю один раз решать задачу и потом пользоваться готовым решением, а наследовать в терминах ущербно-ориентированного программирования - не моё
0
5 / 5 / 2
Регистрация: 13.10.2015
Сообщений: 407
16.05.2016, 16:11 8
А если например надо отсчет от 1,0,0 или вообще 0,1,0 то как быть?
0
6 / 4 / 2
Регистрация: 24.11.2019
Сообщений: 26
25.11.2019, 17:29 9
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
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.11.2019, 18:14 10
Что-то в таком духе:

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
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
25.11.2019, 18:19 11
Цитата Сообщение от rudeuk Посмотреть сообщение
как сделать так
Коллега Psilon показал вам пример. Сам я, к сожалению, уже постепенно отхожу от дотнета, перешел на C++/Qt.
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.11.2019, 18:24 12
Лол, не могу отредактировать сообщение. Смищно.

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

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
6 / 4 / 2
Регистрация: 24.11.2019
Сообщений: 26
25.11.2019, 18:26 13
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
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.11.2019, 18:32 14
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
6 / 4 / 2
Регистрация: 24.11.2019
Сообщений: 26
25.11.2019, 18:36 15
Psilon, спасибо! всё заработало +1
0
25.11.2019, 18:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2019, 18:36
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru