Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/56: Рейтинг темы: голосов - 56, средняя оценка - 4.75
5 / 5 / 4
Регистрация: 06.05.2010
Сообщений: 180

Запустить таймер один раз

16.09.2010, 13:21. Показов 10718. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!

Хочу остановить таймер после первого срабатывания. Делаю это так
C#
1
2
3
4
5
6
timer_Tick(){
    ...
    ...
    ...
    timer.Stop();
}
Не могу понять откуда, но оно вызывается после этого еще раз. Может ли быть, что Timer.Stop() внутри Timer.Tick пропускает еще один тик?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.09.2010, 13:21
Ответы с готовыми решениями:

Таймер вызывает событие только один раз
Доброго времени суток. Будтъте добры подскажите, затупил. Есть такой класс. Я его конструирую, потом вызываю BeginStart. В результате...

Не получается запустить таймер
никак не пойму почему не запускается таймер. создал форму, закинул на нее timer1, numericUpDown1 и кнопку. В свойствах таймера Enable...

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

17
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
16.09.2010, 15:30
C#
1
timer.Enabled = false;
Добавлено через 2 минуты
Хотя Stop() это обертка над Enabled = false. Покажи код, который выполняется в таймере.
Цитата Сообщение от alexey_baranov Посмотреть сообщение
Может ли быть, что Timer.Stop() внутри Timer.Tick пропускает еще один тик?
Наврядли.
0
5 / 5 / 4
Регистрация: 06.05.2010
Сообщений: 180
16.09.2010, 15:35  [ТС]
вот весь код тика
C#
1
2
3
4
5
        private void removeFromParentTimer_Tick(object sender, EventArgs e)
        {
            Parent.Controls.Remove(this);
            removeFromParentTimer.Stop();
        }
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
16.09.2010, 15:45
Цитата Сообщение от alexey_baranov Посмотреть сообщение
Parent.Controls.Remove(this);
А чего ты хочешь этим добиться? И ошибка не вываливается?
0
5 / 5 / 4
Регистрация: 06.05.2010
Сообщений: 180
16.09.2010, 15:50  [ТС]
Ну смысл этого кода такой. Когда элемент становится неактивным, он сереет и через 5 секунд исчезает с экрана.

целиком это выглядит так. Если это можно сделать проще, ю велкам

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public partial class CallView : UserControl
    {
        ...
        ...
        protected void BeginRemoveFromParent()
        {
            BackColor = Color.DarkGray;
            removeFromParentTimer.Start();
        }
 
        private void removeFromParentTimer_Tick(object sender, EventArgs e)
        {
            Parent.Controls.Remove(this);
            removeFromParentTimer.Stop();
        }
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
16.09.2010, 16:19
Вместо
C#
1
Parent.Controls.Remove(this);
написать
C#
1
Visible = false;
Добавлено через 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
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
class NewButton : Button
{
    Timer tmr;
 
    public NewButton()
    {
        this.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
        this.SetStyle(ControlStyles.Selectable, true);
        tmr = new Timer();
        tmr.Enabled = false;
        tmr.Interval = 5000;
        tmr.Tick += new EventHandler(tmr_Tick);
    }
 
    protected override void OnEnter(EventArgs e)
    {
        tmr.Stop();
        this.BackColor = SystemColors.Control;
        base.OnEnter(e);
    }
 
    protected override void OnLeave(EventArgs e)
    {
        RemoveFromScreen();
        base.OnLeave(e);
    }
 
    void RemoveFromScreen()
    {
        this.BackColor = Color.Red;
        tmr.Start();
    }
 
    void tmr_Tick(object sender, EventArgs e)
    {
        this.Visible = false;
        Debug.WriteLine("CLOSE");
        tmr.Stop();
    }
 
    public new void Dispose()
    {
        if (tmr!=null)
        {
            tmr.Dispose();
            tmr = null;
        }
    }
}
В окно Output - CLOSE пишется только один раз.
1
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
16.09.2010, 23:03
SSTREGG, знаешь разницу между System.Windows.Forms.Timer и System.Threading.Timer? а WM_PAINT и WM_TIMER? и то, что new void Dispose не вызовется в половине случаев (я имею ввиду приложения больше пары строк)? не восприми как что-то нехорошее - тут дело совсем в другом
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
16.09.2010, 23:33
Цитата Сообщение от Mikant Посмотреть сообщение
знаешь разницу между System.Windows.Forms.Timer и System.Threading.Timer? а WM_PAINT и WM_TIMER?
Знаю.
Цитата Сообщение от Mikant Посмотреть сообщение
new void Dispose не вызовется в половине случаев
Осведомлён. Я предполагаю надо переопределять Dispose(bool)?
Цитата Сообщение от Mikant Посмотреть сообщение
тут дело совсем в другом
В чём?
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
17.09.2010, 00:34
Цитата Сообщение от alexey_baranov Посмотреть сообщение
Привет!

Хочу остановить таймер после первого срабатывания. Делаю это так
C#
1
2
3
4
5
6
timer_Tick(){
    ...
    ...
    ...
    timer.Stop();
}
Не могу понять откуда, но оно вызывается после этого еще раз. Может ли быть, что Timer.Stop() внутри Timer.Tick пропускает еще один тик?
C#
1
timer.Stop();
должно быть первым в обработчике, так как если выполнить то что внутри занимает больше времени чем частота таймера, то он выполнится второй раз, а выключив вначале вы гарантированно этого избегаете.
0
5 / 5 / 4
Регистрация: 06.05.2010
Сообщений: 180
17.09.2010, 12:14  [ТС]
Цитата Сообщение от new_in_net Посмотреть сообщение
должно быть первым в обработчике, так как если выполнить то что внутри занимает больше времени чем частота таймера, то он выполнится второй раз, а выключив вначале вы гарантированно этого избегаете.
Пожалуй. А как быть с тем, что Tick выполняется в основном потоке? Если Tick произойдет как раз в тот момент, когда форма выполняет долгую операцию, Tick долго будет ждать своей очереди. Пока он запустится и вызовет timer.Stop(), поток таймера уже может поставить второй Tick. Правильно я понимаю?
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
17.09.2010, 18:42
Цитата Сообщение от alexey_baranov Посмотреть сообщение
Пожалуй. А как быть с тем, что Tick выполняется в основном потоке? Если Tick произойдет как раз в тот момент, когда форма выполняет долгую операцию, Tick долго будет ждать своей очереди. Пока он запустится и вызовет timer.Stop(), поток таймера уже может поставить второй Tick. Правильно я понимаю?
думаю, что маловероятно.
Если будут сомнения что может вдруг выполниться второй раз, то тогда используй lock


C#
1
2
3
4
5
6
7
8
9
timer_Tick(){
   lock
   {
      timer.Stop();
   }
    ...
    ...
    ...
}
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
16.10.2010, 02:53
Смотря какой из таймеров Вы используете.
0
5 / 5 / 4
Регистрация: 06.05.2010
Сообщений: 180
16.10.2010, 16:52  [ТС]
Syetem.Win.Forms.Timer
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
17.10.2010, 02:19
Тогда это весьма странно, т.к. он выполняется в том же потоке, а значит два тика не может произойти одновременно. 100 раз уже пользовался этим способом чтоб выполнить метод один раз через какое-то время и ни разу не было проблем.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
17.10.2010, 14:27
Цитата Сообщение от body90 Посмотреть сообщение
а значит два тика не может произойти одновременно
Не может. Но если код в событии таймера выполняется долго, то таймер может сработать ещё один раз, после того как ему сделали Enabled = false; Вот пример такой ситуации:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        int y = 0;
        Stopwatch sw = new Stopwatch();
        // Interval = 10
        private void timer1_Tick(object sender, EventArgs e)
        {
            sw.Stop();
            for (int i = -999999; i != 999999; i++)
                ;
            Debug.WriteLine(y++ + ": " + sw.ElapsedTicks);
            sw.Reset();
            sw.Start();
        }
Иногда будут проскакивать моменты когда разница во времени между выполнением Tick (sw.ElapsedTicks) будет равняться нескольким десяткам тиков (на моём компе, по крайней мере). Грубо говоря создается очередь из 2х событий.

+ повтор может быть ещё из-за того что основной поток блокируется и Enabled = false не проходит сразу.
0
5 / 5 / 4
Регистрация: 06.05.2010
Сообщений: 180
17.10.2010, 16:35  [ТС]
Цитата Сообщение от body90 Посмотреть сообщение
Тогда это весьма странно, т.к. он выполняется в том же потоке, а значит два тика не может произойти одновременно. 100 раз уже пользовался этим способом чтоб выполнить метод один раз через какое-то время и ни разу не было проблем.
Само событие тика- то в главном. А вот тики запускаются из другого потока. Если основной поток долго не может обработать BeginInvoke, в котором будет остановлен таймер, то вспомогательный поток за это время запульнет еще парочку тиков. Мне кажется в этом все дело.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
18.10.2010, 01:15
На сколько я знаю, этот таймер работает только в своём потоке. Хотя это стало уже холиваром.
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
18.10.2010, 02:55
alexey_baranov, в принципе, прав.

а по сабжу... не надо мудрить, господа! - при запуске таймера поставьте какой-нибудь bool eventFired = false; а второй же строкой обработчика "тика" меняйте это значение на true... и чтоб все остальные вызовы не проходили.

зы. пища для ума: событие WM_TIMER обрабатывается последним в MSMQ!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2010, 02:55
Помогаю со студенческими работами здесь

Запустить таймер на определенное время
Здравствуйте, у меня есть кнопка, таймер и NumericUoDown. Нужно указать время в NumericUpDown на которое запускается таймер.

Если нажата клавиша, то запустить таймер
//button1.Click += delegate { timer.Interval = Convert.ToInt32(text); ...

Запустить таймер и выдать сообщение об истекшем интервале времени
Само окно я сделал,а вот код программы не могу, с программированием я на ВЫ((Кто может помогите пожалуйста.

Как одновременно с открытием вкладки браузера запустить таймер?
Используется: C#, WebDriver СЦЕНАРИЙ 1. Открываем браузер 2. Переходим по ссылке Запускаем Таймер (секундомер) 3....

Таймер срабатывает неверное количество раз
Доброго времени суток, друзья! Помогите пожалуйста разобраться! Необходимо производить действие с некоторой периодичностью. Во всех...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru