Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2013, 23:42   #1
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию Timer

вот озадачился, написать прогу "таймер"
выкладываю коды свои которые написал, если что не правильно, вы меня пожалуйста поправьте(пробую многое чтобы опыт нарастить, надеюсь вы мне не откажите в помощи)
Код:
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;

namespace Ringer
{
    public partial class Form1 : Form
    {
        int min = 0, sek = 0, milisek = 0;

        public Form1()
        {
            InitializeComponent();
            timer1.Interval = 1000;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            if (timer1.Enabled)
            {
                timer1.Enabled = false;
                button1.Enabled = false;
            }
            else
            {
                timer1.Enabled = true;
                button1.Enabled = false;
            }



        }

        private void timer1_Tick(object sender, EventArgs e)
        {
           int min=0, sek=0, mili=0;
            while (button1.Enabled)
            {
                 for (min = 0; min <= 59; min++)
                {
                    for (sek = 0; sek <= 59; sek++)
                    {
                       for (mili = 0; mili <= 59; mili++)
                        {
                             Console.Write("00:00:00" + label1);
                        }
                    }
                }
            }


        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;

            
                
        }
    }
}
больше знаю, лучше сплю)

Последний раз редактировалось Stilet; 31.08.2013 в 10:53.
nwhta вне форума Ответить с цитированием
Старый 31.08.2013, 10:55   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Цитата:
вы меня пожалуйста поправьте
1. Не нужно объявлять несколько раз переменные с одним названием. Это будут разные переменные по уровню видимости. Достаточно один раз объявить переменные на уровне класса и работать с ними в разных методах если это необходимо.
2. В методе таймера сдавать переменные не нужно. Читайте п1.
3. Циклы в методе таймера не используются. Работа таймера итак происходит "в цикле" с некоторым установленным интервалом.
4. Не нужно смешивать Console и WinForms. Это я про вывод результата на экран.
5. Миллисекунды у вас считаться не будут, потому что интервал таймера установлен в 1000, а это 1 секунда.
Мой вариант таймера
Код:
 public partial class Form1 : Form
    {
        int hour, min, sek;
        public Form1()
        {
            InitializeComponent();
           
        }

        private void button1_Click(object sender, EventArgs e)//старт
        {
            if (!timer1.Enabled)
            {
                button1.Enabled = false;
                button2.Enabled = true;
                timer1.Enabled = true;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (button2.Enabled)
            {
                sek++;
                if (sek > 59)
                {
                    sek = 0;
                    min++;
                }

                if (min > 59)
                {
                    min = 0;
                    hour++;
                }

                if (hour > 23)
                {
                    hour = 0;
                }
            }

            label1.Text = hour.ToString() + ":" + min.ToString() + ":" + sek.ToString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 1000;
            timer1.Enabled = false;
            button2.Enabled = false;
            label1.Text = "0:0:00";
            hour = 0;
            sek = 0;
            min = 0;
        }

        private void button2_Click(object sender, EventArgs e)//стоп
        {
            timer1.Enabled = false;
            button1.Enabled = true;
            button2.Enabled = false;
           
        }
    }
p.s. Надеюсь нигде не ошибся в объяснениях.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 31.08.2013, 11:00   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А в чем смысл сего таймера? Т.е. я имею ввиду что твои четыре цикла в тике просто загрузят на 100% проц. Что нужно? - секундомер?
В таймерах для измерения времени циклы не ставят - таймер сам по себе цикл.
Цитата:
Console.Write("00:00:00" + label1);
Вот ума не приложу, зачем мешать консольные и оконные методы... Что это дает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2013, 11:12   #4
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

Цитата:
Сообщение от GetMax Посмотреть сообщение
1. Не нужно объявлять несколько раз переменные с одним названием. Это будут разные переменные по уровню видимости. Достаточно один раз объявить переменные на уровне класса и работать с ними в разных методах если это необходимо.
2. В методе таймера сдавать переменные не нужно. Читайте п1.
3. Циклы в методе таймера не используются. Работа таймера итак происходит "в цикле" с некоторым установленным интервалом.
4. Не нужно смешивать Console и WinForms. Это я про вывод результата на экран.
5. Миллисекунды у вас считаться не будут, потому что интервал таймера установлен в 1000, а это 1 секунда.
Мой вариант таймера
Код:
 public partial class Form1 : Form
    {
        int hour, min, sek;
        public Form1()
        {
            InitializeComponent();
           
        }

        private void button1_Click(object sender, EventArgs e)//старт
        {
            if (!timer1.Enabled)
            {
                button1.Enabled = false;
                button2.Enabled = true;
                timer1.Enabled = true;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (button2.Enabled)
            {
                sek++;
                if (sek > 59)
                {
                    sek = 0;
                    min++;
                }

                if (min > 59)
                {
                    min = 0;
                    hour++;
                }

                if (hour > 23)
                {
                    hour = 0;
                }
            }

            label1.Text = hour.ToString() + ":" + min.ToString() + ":" + sek.ToString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 1000;
            timer1.Enabled = false;
            button2.Enabled = false;
            label1.Text = "0:0:00";
            hour = 0;
            sek = 0;
            min = 0;
        }

        private void button2_Click(object sender, EventArgs e)//стоп
        {
            timer1.Enabled = false;
            button1.Enabled = true;
            button2.Enabled = false;
           
        }
    }
p.s. Надеюсь нигде не ошибся в объяснениях.
Хм...........очень интересно Спасибо
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Старый 31.08.2013, 11:13   #5
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А в чем смысл сего таймера? Т.е. я имею ввиду что твои четыре цикла в тике просто загрузят на 100% проц. Что нужно? - секундомер?
В таймерах для измерения времени циклы не ставят - таймер сам по себе цикл.

Вот ума не приложу, зачем мешать консольные и оконные методы... Что это дает?
Извиняюсь, это ошибка, я просто учусь))
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Старый 31.08.2013, 11:26   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это ошибка
Ну не то чтобы ошибка, но к ошибкам может привести.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2013, 11:35   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Мда...
я бы сказал, что тут всё неправильно.
1 в событии нажатия кнопки Вы делаете её неактивной
Код:
private void button1_Click(object sender, EventArgs e)
...
button1.Enabled = false;
и кликуть по ней уже будет нельзя по сути никогда (а Вам по ней , надо кликнуть насколько видно из кода, в обработчике клика стоит иф - т.е. проверка условия, каковая имеет смысл только при нескольких кликах). Что исправить - сказать нельзя никак, ибо неизвестно чего вы хотите добиться.
2. обработчик тика - сущий бред - тройной цикл с обрамляющим вайлом вообще как козни сатаны тут смотрится.
3. Console.Write("00:00:00" + label1); верх киберпреступного гения. в виндовсформс проекте выводить что-то на консоль (такое возможно конечно, но не для Вашего уровня), пишется же сущность , которая ввергнет любого в ужас, некая операция "сложения" (а само оно тут неприменимо, не числа ибо) строки и объекта, что совершенно неприемлемо в данном языке.

По факту (как я понимаю задачу, это таймер с возможностью паузы), надо выкинуть всё, кроме public Form1() и сделать
Код:
DateTime start;
int ticks = 0;
public Form1()
{
    InitializeComponent();
    start = new DateTime();
    timer1.Interval = 100;
    button1.Text = "Start/pause";
    button2.Text = "Stop";
}
private void button1_Click_1(object sender, EventArgs e)
{
    timer1.Enabled = !timer1.Enabled;
}
private void timer1_Tick(object sender, EventArgs e)
{
    ticks++;
    timeshow();
}
private void timeshow()
{
    label1.Text = string.Format("{0:HH:mm:ss:fff}", start.AddMilliseconds(timer1.Interval * ticks));
}
private void button2_Click(object sender, EventArgs e)
{
    ticks = 0;
    timer1.Enabled = false;
    timeshow();
}
Интервал таймера надо подобрать, ибо винда не умеет работать в реальном времени с высокой точностью, около 100 миллисекунд - нормально.

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

Последний раз редактировалось phomm; 31.08.2013 в 11:38.
phomm вне форума Ответить с цитированием
Старый 31.08.2013, 12:29   #8
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Мда...
я бы сказал, что тут всё неправильно.
1 в событии нажатия кнопки Вы делаете её неактивной
Код:
private void button1_Click(object sender, EventArgs e)
...
button1.Enabled = false;
и кликуть по ней уже будет нельзя по сути никогда (а Вам по ней , надо кликнуть насколько видно из кода, в обработчике клика стоит иф - т.е. проверка условия, каковая имеет смысл только при нескольких кликах). Что исправить - сказать нельзя никак, ибо неизвестно чего вы хотите добиться.
2. обработчик тика - сущий бред - тройной цикл с обрамляющим вайлом вообще как козни сатаны тут смотрится.
3. Console.Write("00:00:00" + label1); верх киберпреступного гения. в виндовсформс проекте выводить что-то на консоль (такое возможно конечно, но не для Вашего уровня), пишется же сущность , которая ввергнет любого в ужас, некая операция "сложения" (а само оно тут неприменимо, не числа ибо) строки и объекта, что совершенно неприемлемо в данном языке.

По факту (как я понимаю задачу, это таймер с возможностью паузы), надо выкинуть всё, кроме public Form1() и сделать
Код:
DateTime start;
int ticks = 0;
public Form1()
{
    InitializeComponent();
    start = new DateTime();
    timer1.Interval = 100;
    button1.Text = "Start/pause";
    button2.Text = "Stop";
}
private void button1_Click_1(object sender, EventArgs e)
{
    timer1.Enabled = !timer1.Enabled;
}
private void timer1_Tick(object sender, EventArgs e)
{
    ticks++;
    timeshow();
}
private void timeshow()
{
    label1.Text = string.Format("{0:HH:mm:ss:fff}", start.AddMilliseconds(timer1.Interval * ticks));
}
private void button2_Click(object sender, EventArgs e)
{
    ticks = 0;
    timer1.Enabled = false;
    timeshow();
}
Интервал таймера надо подобрать, ибо винда не умеет работать в реальном времени с высокой точностью, около 100 миллисекунд - нормально.

упд. Ух ёклмн, пока набирал пост уже пачка ответов приехала... надо блин приучать себя набирать в ворде и перед постингом обновлять тему, сколько раз уже обжигался.
Спасибо за поддержку
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Старый 31.08.2013, 13:41   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Рад, что это способствует Вашему росту.

Однако, код оформлять Вы почти сразу научились, а вот из цитаты желательно удалять большую часть содержания, (или вообще всю, сделав только обращение к соотв. форумчанину), или же оставив конкретные небольшие кусочки, если Вам надо на соотв. элементы поста ответить. Иначе получается "оверквотинг", что есть нарушение на данном и большинстве других форумов.
phomm вне форума Ответить с цитированием
Старый 31.08.2013, 20:42   #10
nwhta
Форумчанин
 
Регистрация: 30.08.2013
Сообщений: 153
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
}
private void timer1_Tick(object sender, EventArgs e)
{
ticks++;
timeshow();
}
private void timeshow()
{
label1.Text = string.Format("{0:HH:mm:ss:fff}", start.AddMilliseconds(timer1.Interv al * ticks));
}
А можно в подробностях эти 2 метода разобрать?(и коды соответственно)
больше знаю, лучше сплю)
nwhta вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Timer samsung Общие вопросы Delphi 1 17.12.2011 08:41
timer Cpluser C# (си шарп) 4 06.09.2011 17:33
timer Erick Cartman Помощь студентам 4 12.03.2010 19:57
Timer Arhangel_bes Помощь студентам 2 27.10.2008 17:55
timer Toxa Компоненты Delphi 6 06.12.2006 06:58