Как перезапустить таймер в c
Перейти к содержимому

Как перезапустить таймер в c

  • автор:

Реализовать сброс таймера

Есть таймер, кнопка запуск\стоп и кнопка сброс, все традиционно. Но я не могу придумать как его сбросить.

using System; using System.Windows.Forms; namespace lab6 < public partial class ChildForm : Form < DateTime date = DateTime.Now; Timer timer = new Timer(); public ChildForm() < InitializeComponent(); >private void tickTimer(object sender, EventArgs e) < long tick = DateTime.Now.Ticks - date.Ticks; DateTime stopWatch = new DateTime(); stopWatch = stopWatch.AddTicks(tick); label1.Text = String.Format("", stopWatch); > private void button1_Click_1(object sender, EventArgs e) //это кнопка старт\стоп < timer.Enabled = !timer.Enabled; timer.Interval = 1; timer.Tick += new EventHandler(tickTimer); button1.Text = timer.Enabled ? "Стоп" : "Старт"; >private void button3_Click(object sender, EventArgs e) < //button3 это кнопка, отвечающая за сброс. Тут собственно метод нужон. >> > 

Отслеживать
задан 23 апр 2020 в 11:05
Mikkel Ontberg Mikkel Ontberg
75 9 9 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

У вас привязка идет к моменту запуска программы, немного странная реализация. Но велосипед можно не изобретать и использовать специально предназначенный для этого класс Stopwatch .

Поправил код:

using System.Diagnostics; 
public partial class ChildForm : Form < Timer timer = new Timer(); Stopwatch stopWatch = new Stopwatch(); public ChildForm() < InitializeComponent(); // это надо сделать 1 раз, а не каждый раз, когда вы запускаете таймер. // еще этот код лучше унести отсюда в обработчик события Form.Load // потому что в конструкторе окна в целом опасно вставлять код timer.Interval = 1; timer.Tick += new EventHandler(tickTimer); >private void tickTimer(object sender, EventArgs e) < // вынес обновление текста таймера в отдельный метод RefreshTimer(); >private void RefreshTimer() < // мне не нравится эта реализация, возможно есть способ проще // но код писал на коленке в блокноте, не мог тестировать DateTime date = new DateTime(stopWatch.ElapsedTicks); label1.Text = String.Format("", date); > private void button1_Click_1(object sender, EventArgs e) < timer.Enabled = !timer.Enabled; if (timer.Enabled) stopWatch.Start(); else stopWatch.Stop(); button1.Text = timer.Enabled ? "Стоп" : "Старт"; >private void button3_Click(object sender, EventArgs e) < stopWatch.Reset(); RefreshTimer(); // и вот почему я вынес в отдельный метод >> 

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

Отслеживать
ответ дан 23 апр 2020 в 20:02
50k 6 6 золотых знаков 25 25 серебряных знаков 60 60 бронзовых знаков
Спасибо большое.
24 апр 2020 в 6:51

Пример использования моего таймера:

CountDownTimer timer = new CountDownTimer();//создаем инстанс timer.SetTime(30,0); //выставляем на 30 минут timer.StepMs = 33; //Выставляем шаг таймера (как часто вызывается TimeChanged) //Подписываемся на событие TimeChanged и в нем обновляем значение лейбла timer.TimeChanged += () => Label1.Text = timer.TimeLeftMsStr; // Подписываемся на событие окончания таймера и реагируем на него сообщухой timer.CountDownFinished += () => MessageBox.Show("Timer finished the work!"); timer.Start(); //стартуем 

И не забываем вызвать Dispose(); когда таймер уже не нужен.

Сброс можно сделать по вызову метода reset() или restart()

Код самого таймера:

using System; using System.Diagnostics; using System.Windows.Forms; public class CountDownTimer : IDisposable < public Stopwatch _stpWatch = new Stopwatch(); public Action TimeChanged; public Action CountDownFinished; public bool IsRunnign =>timer.Enabled; public int StepMs < get =>timer.Interval; set => timer.Interval = value; > private Timer timer = new Timer(); private TimeSpan _max = TimeSpan.FromMilliseconds(30000); public TimeSpan TimeLeft => (_max.TotalMilliseconds - _stpWatch.ElapsedMilliseconds) > 0 ? TimeSpan.FromMilliseconds(_max.TotalMilliseconds - _stpWatch.ElapsedMilliseconds) : TimeSpan.FromMilliseconds(0); private bool _mustStop => (_max.TotalMilliseconds - _stpWatch.ElapsedMilliseconds) < 0; public string TimeLeftStr =>TimeLeft.ToString(@"\mm\:ss"); public string TimeLeftMsStr => TimeLeft.ToString(@"mm\:ss\.fff"); private void TimerTick(object sender, EventArgs e) < TimeChanged?.Invoke(); if (_mustStop) < CountDownFinished?.Invoke(); _stpWatch.Stop(); timer.Enabled = false; >> public CountDownTimer(int min, int sec) < SetTime(min, sec); Init(); >public CountDownTimer(TimeSpan ts) < SetTime(ts); Init(); >public CountDownTimer() < Init(); >private void Init() < StepMs = 1000; timer.Tick += new EventHandler(TimerTick); >public void SetTime(TimeSpan ts) < _max = ts; TimeChanged?.Invoke(); >public void SetTime(int min, int sec = 0) => SetTime(TimeSpan.FromSeconds(min * 60 + sec)); public void Start() < timer.Start(); _stpWatch.Start(); >public void Pause() < timer.Stop(); _stpWatch.Stop(); >public void Stop() < Reset(); Pause(); >public void Reset() < _stpWatch.Reset(); >public void Restart() < _stpWatch.Reset(); timer.Start(); >public void Dispose() => timer.Dispose(); > 

Как перезапустить таймер

Author24 — интернет-сервис помощи студентам

А не мог бы кто-нибудь подсказать, что произойдет с таймером, если выполнить Timer.Start(), когда таймер уже запущен (ожидаю перезапуск таймера, но проверить пока негде).

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как перезапустить explorer через команду?
Есть ли способ обновить/перезапустить explorer.exe безобидным способом, чтобы открытые приложения.

Как перезапустить таймер T0 на 2313?
Подскажите пож, как произвольно перезапускать таймер T0 на tiny2313? просто PSR10_bit:= 1; не.

Перезапустить таймер
Доброе время суток. Подскажите пожалуйста, как перезапустить таймер? Есть label18 в котором идет.

Как перезапустить форму?
Всем привет.Вопрос следующий: у меня есть форма и мне надо ,чтоб пользователь по нажатию на кнопку.

Как перезапустить таймер с теми же функцией и параметрами, но новым временем?

Как мне вытащить из него правильно функцию и параметры, и передать далее?
В js это реализуемо так:

const timer1 = setTimeout(testFunc, 5000, 'asd', 'qwe') const timer2 = setTimeout(timer1._onTimeout, 10000, timer1._timerArgs[0], timer1._timerArgs[1]) clearTimeout(timer1)

Но ts не позволяет подобного
Вопрос — как сделать нечто подобное, учитывая что 2 таймер не видит ни функцию testFunc, ни параметры переданные в нее, ибо находится в другом ивенте

  • Вопрос задан 13 апр.
  • 54 просмотра

1 комментарий

Простой 1 комментарий

WblCHA

Сделай свою обёртку. К тому же это явно удобнее.

const createTimeout = (fn, timeout, . args) => < let isInvoked = false const timeoutFn = () => < if(isInvoked) < return; >isInvoked = true fn(. args) > let timeoutId = setTimeout(timeoutFn, timeout); return < isInvoked: () =>isInvoked, reset: (newTimeout = timeout) => < if(isInvoked) < return false; >clearTimeout(timeoutId); timeoutId = setTimeout(timeoutFn, newTimeout); return true; > > > const t = createTimeout(() => console.log(1), 100) t.reset(1000)

Решения вопроса 1

rqdkmndh

Web-разработчик

Чтобы выполнить перезапуск таймера в TypeScript, вы не сможете использовать свойства, такие как _onTimeout и _timerArgs, поскольку они не являются частью стандартного API и обычно не доступны для типобезопасного кода. В TypeScript (и в JavaScript в целом) для более чистого подхода рекомендуется создать обёртку для таймера, которая будет управлять поведением и позволит перезапустить таймер с новым временем.
Попробуйте так:

function restartTimer( originalFunc: (. args: any[]) => void, newDelay: number, . args: any[] ): number < clearTimeout(timerId); // timerId должен быть доступен в области видимости return setTimeout(originalFunc, newDelay, . args); >// Используйте так: let timerId: number; // Храните timerId в доступном месте function testFunc(param1: string, param2: string) < console.log(param1); console.log(param2); >// Запуск таймера timerId = setTimeout(testFunc, 5000, 'asd', 'qwe'); // В нужный момент перезапустить таймер с новым временем. Например, с 10000 мс. timerId = restartTimer(testFunc, 10000, 'asd', 'qwe');

Важно отметить, что переменная timerId должна быть доступна для функции restartTimer, чтобы она могла очистить предыдущий таймер перед запуском нового.

Ответ написан 13 апр.
Getaxe @getaxe Автор вопроса

Отмечу решением только потому, что считаю, что ответ на мой вопрос имеется.

А именно — нельзя достать эти аргументы напрямую в TS, и нужно придумывать, как вы выразились, обертку.
Ваш пример мне не совсем подходит, ибо передать в restartTimer те же поля я не могу, по причине того, что я их не знаю, но можно сделать доп переменную, которая будет менять поведение функции таймера.

p.s. Спасибо за ответ, JS знаю в совершенстве, особенности TS’a учу)

p.p.s. Для тех, кому может понадобиться — пример:

function testFunc(param1: string, param2: string, isExtraTime:boolean) < const isExtendTime = true // Получить поле, которое хранится в JSON файле или в DB. if(isExtendTime && !isExtraTime) < // С рассчетом на одноразовое продление setTimeout(testFunc, 10000, 'asd', 'qwe', true); // Продление таймера, если необходимо return; >console.log(param1); console.log(param2); > // Запуск таймера setTimeout(testFunc, 5000, 'asd', 'qwe', false);

Если я правильно вас понял, и трактовал, подайте пожалуйста какой-нибудь знак, если же нет, то, пожалуйста, поправьте.

timer

Используйте timer запланировать одно или несколько выполнения задач, состоявших из MATLAB ® функции обратного вызова. Если таймер, как планируют, выполнится многократно, можно задать время между выполнением и как обработать конфликты постановки в очередь \by корректировка свойств таймера.

timer возразите использует функции обратного вызова, чтобы выполнить команды. Функции обратного вызова выполняют код во время некоторого события, прошедшее время в случае timer . Для timer объект, можно задать функцию обратного вызова как указатель на функцию или как вектор символов. Если функция обратного вызова является вектором символов, MATLAB выполняет ее как исполняемый код. Объект — таймер поддерживает функции обратного вызова, когда таймер запускается ( StartFcn ), выполняется ( TimerFcn ), остановки ( StopFcn ), или обнаружение ошибка ( ErrorFcn ). Для получения дополнительной информации связанный с функциями обратного вызова, смотрите Функции обратного вызова Таймера.

Создание

Синтаксис

Описание

t = timer создает пустой timer возразите, чтобы запланировать выполнение команд MATLAB. Прежде, чем запустить таймер, необходимо установить TimerFcn свойство для объекта — таймера.

Таймер t имеет свойства, которые управляют его поведением. Доступ к свойству при помощи p = t.Property и измените одно использование t.Property = p . Сохранить и восстановить все свойства t , можно использовать A = get(t) и set(t,A) , соответственно.

t = timer( Name,Value ) Задает дополнительные опции, которые используют один или несколько Name-Value аргументы.

Свойства

Свойства функции обратного вызова

TimerFcn — Функция обратного вызова таймера
вектор символов | строковый скаляр | указатель на функцию | массив ячеек

Функция обратного вызова таймера в виде вектора символов, строкового скаляра, указателя на функцию или массива ячеек. Прежде чем можно будет запустить таймер, необходимо задать это свойство.

  • Если вы задаете это свойство при помощи указателя на функцию, когда MATLAB выполняет коллбэк, это передает timer возразите и структура события против функции обратного вызова. Структура события содержит тип события в Type поле и время события в Data поле .
  • Если вы задаете это свойство при помощи вектора символов или строкового скаляра, когда MATLAB выполняет коллбэк, это оценивает код MATLAB, содержавшийся в векторе символов. При определении коллбэка, когда не рекомендуется вектор символов. Использование функции, заданной как указатель на функцию, позволяет MATLAB предоставить важную информацию вашей функции обратного вызова.
  • Если ваша функция обратного вызова принимает аргументы в дополнение к timer данные объектов и данные о событиях, задайте это свойство как массив ячеек, содержащий указатель на функцию и дополнительные аргументы.

Для получения дополнительной информации смотрите Функции обратного вызова Таймера.

Пример: t = timer(‘TimerFcn’,»MyTimerFunction(Input);»)

StartFcn — Таймер запускает функцию обратного вызова
вектор символов | строковый скаляр | указатель на функцию | массив ячеек

Таймер запускает функцию обратного вызова в виде вектора символов, строкового скаляра, указателя на функцию или массива ячеек.

  • Если вы задаете это свойство при помощи указателя на функцию, когда MATLAB выполняет коллбэк, это передает timer возразите и структура события против функции обратного вызова. Структура события содержит тип события в Type поле и время события в Data поле .
  • Если вы задаете это свойство при помощи вектора символов или строкового скаляра, когда MATLAB выполняет коллбэк, это оценивает код MATLAB, содержавшийся в векторе символов. При определении коллбэка, когда не рекомендуется вектор символов. Использование функции, заданной как указатель на функцию, позволяет MATLAB предоставить важную информацию вашей функции обратного вызова.
  • Если ваша функция обратного вызова принимает аргументы в дополнение к timer данные объектов и данные о событиях, задайте это свойство как массив ячеек, содержащий указатель на функцию и дополнительные аргументы.

Для получения дополнительной информации смотрите Функции обратного вызова Таймера.

Пример: t = timer(‘StartFcn’,@MyStartFunction(~,~))

StopFcn — Функция обратного вызова остановки таймера
вектор символов | строковый скаляр | указатель на функцию | массив ячеек

Функция обратного вызова остановки таймера в виде вектора символов, строкового скаляра, указателя на функцию или массива ячеек.

Таймер останавливается когда:

  • Вы вызываете таймер stop метод.
  • Таймер закончил выполнять TimerFcn . Другими словами, значение TasksExecuted достигает предела , установленного TasksToExecute .
  • Ошибка происходит. ErrorFcn коллбэк называется сначала, сопровождается StopFcn ‘callback’.

Можно использовать StopFcn задавать действия очистки, такие как удаление объекта — таймера из памяти.

  • Если вы задаете это свойство при помощи указателя на функцию, когда MATLAB выполняет коллбэк, это передает timer возразите и структура события против функции обратного вызова. Структура события содержит тип события в Type поле и время события в Data поле .
  • Если вы задаете это свойство при помощи вектора символов или строкового скаляра, когда MATLAB выполняет коллбэк, это оценивает код MATLAB, содержавшийся в векторе символов. При определении коллбэка, когда не рекомендуется вектор символов. Использование функции, заданной как указатель на функцию, позволяет MATLAB предоставить важную информацию вашей функции обратного вызова.
  • Если ваша функция обратного вызова принимает аргументы в дополнение к timer данные объектов и данные о событиях, задайте это свойство как массив ячеек, содержащий указатель на функцию и дополнительные аргументы.

Для получения дополнительной информации смотрите Функции обратного вызова Таймера.

Пример: t = timer(‘StopFcn’,@MyStopFunction(~,~))

ErrorFcn — Ошибочная функция обратного вызова таймера
вектор символов | строковый скаляр | указатель на функцию | массив ячеек

Ошибочная функция обратного вызова таймера в виде вектора символов, строкового скаляра, указателя на функцию или массива ячеек. Если существует ошибка, эта функция выполняется, и затем вызывает StopFcn .

  • Если вы задаете это свойство с помощью вектора символов или строкового скаляра, когда MATLAB выполняет коллбэк, это оценивает код MATLAB, содержавшийся в векторе символов.
  • Если вы задаете это свойство с помощью указателя на функцию, когда MATLAB выполняет коллбэк, это передает timer возразите и структура события против функции обратного вызова. Структура события содержит тип события в Type поле и время события в Data поле .
  • Если ваша функция обратного вызова принимает аргументы в дополнение к timer данные объектов и данные о событиях, задайте это свойство как массив ячеек, содержащий указатель на функцию и дополнительные аргументы.

Для получения дополнительной информации смотрите Функции обратного вызова Таймера.

Пример: t = timer(‘ErrorFcn’,’disp(«An error has occured»)’)

Синхронизация свойств

Period — Задержитесь между выполнением
1 (значение по умолчанию) | числовой скаляр

Задержитесь между выполнением, заданным, в секундах, как номер, больше, чем 0,001. Для таймера, чтобы использовать Period , необходимо установить ExecutionMode и TasksToExecute запланировать несколько событий коллбэка объекта — таймера.

Пример: t = timer(‘Period’,5)

StartDelay — Задержитесь между запуском таймера и первым выполнением
0 (значений по умолчанию) | числовой скаляр

Задержитесь между запуском таймера и первым выполнением, заданным, в секундах, как номер, больше, чем или равный 0. Когда Running = ‘on’ , StartDelay только для чтения.

Пример: t = timer(‘StartDelay’,2)

TasksToExecute — Функция обратного вызова таймера времен выполняется
числовой скаляр

Функция обратного вызова таймера времен выполняется в виде номера, больше, чем 0. Используйте TasksToExecute свойство определить номер выполнения. Использовать TasksToExecute , необходимо установить ExecutionMode запланировать несколько событий коллбэка таймера. Изменение TasksToExecute в то время как таймер является рабочей силой не, сразу вступают в силу, в зависимости от состояния очереди таймера. Для получения дополнительной информации связанный с очередью таймера, см. Обработку конфликтов очереди таймера.

Пример: t = timer(‘TasksToExecute’,5)

BusyMode — Организация очередей коллбэка таймерной функции
‘drop’ (значение по умолчанию) | ‘error’ | ‘queue’

Организация очередей коллбэка таймерной функции в виде одного из значений в таблице. Используйте это свойство задать меры, принятые, когда таймер должен будет выполнить TimerFcn перед завершением предыдущего выполнения TimerFcn . Когда Running свойство установлено в ‘on’ , BusyMode свойство только для чтения.

BusyMode свойство влияет на поведение только когда ExecutionMode свойство установлено в FixedRate . Для других значений ExecutionMode , там не может перекрывать попытки выполнить функцию обратного вызова таймера, потому что задержка между выполнением всегда относительно завершения предыдущего выполнения.

Поведение, если Пустая Очередь

Поведение, если Очередь, Не Пустая

Добавьте задачу поставить в очередь

Возможный пропуск TimerFcn вызовы

Добавьте задачу поставить в очередь

Выполните задачу; выдайте ошибку, заданную ErrorFcn ; таймер остановок

Таймер остановок после завершающегося выполняющегося в данного момента задачи

Добавьте задачу поставить в очередь

Ожидайте очереди, чтобы очистить, и затем ввести задачу в очередь

Настраивает Period свойство управлять задачами в очереди выполнения

См. Обработку конфликтов очереди таймера для получения дополнительной информации.

Пример: t = timer(‘BusyMode’,’error’)

ExecutionMode — Планирование коллбэка таймерной функции
‘singleShot’ (значение по умолчанию) | ‘fixedRate’ | ‘fixedDelay’ | ‘fixedSpacing’

Планирование коллбэка таймерной функции в виде одного из значений в таблице. Когда Running=’on’ , ExecutionMode только для чтения. Эта таблица суммирует режимы выполнения.

Время Period Стартовая точка

Функция обратного вызова таймера выполняется только однажды. Поэтому Period свойство не оказывает влияния. Этот режим является режимом выполнения по умолчанию.

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

Запустите, когда коллбэк таймерной функции перезапустит выполнение после задержки из-за задержек очереди выполнения MATLAB.

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

  • ‘singleShot’ один режим выполнения для timer класс, и является значением по умолчанию.

Пример: t = timer(‘ExecutionMode’,’fixedDelay’)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *