Как перезапустить таймер по кнопке
Есть код таймера всё отлично только не знаю как сделать чтобы по кнопке которую я задам он перезапускался

jQuery(document).ready(function($) < $('.send-new-code-button').click(function(event) < $('.send-new-code').show(); $('.sent-to-number').show(); (function(d)< var display = d.querySelector('#countdown .display') // меняющаяся цифра var timeLeft = parseInt(display.innerHTML) // оставшееся время var timer = setInterval(function()< if (--timeLeft >= 0) < // если таймер всё еще больше нуля display.innerHTML = timeLeft // обновляем цифру >else < d.querySelector('#countdown h1').style.display = 'none' // прячем теекст d.querySelector('.send-new-code').style.display = 'none' // прячем теекст d.querySelector('.sent-to-number').style.display = 'none' // прячем теекст d.querySelector('.send-new-code-button').style.display = 'inline-block' // показываем кнопку clearInterval(timer) // удаляем таймер >>, 1000) // таймер срабатывает каждые 1000 msec (1 sec) >)(document) >); >);
Отслеживать
задан 22 фев 2019 в 9:10
33 3 3 бронзовых знака
Код в виде картинок — это жесть конечно. Вам трудно скопипастить текст кода?
22 фев 2019 в 9:14
«чтобы по кнопке которую я задам» — ??
– user176262
22 фев 2019 в 14:45
да мне надо чтобы при клике с каким то class таймер запускался снова
22 фев 2019 в 17:21
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для перезапуска таймера нужно где-либо хранить его идентификатор (возвращаемый функциями setTimeout и setInterval ) и в нужном месте (обработчике кнопки, например) отменять его (через clearTimeout или clearInterval ) и запускать заново.
Отслеживать
ответ дан 22 фев 2019 в 11:31
381 1 1 золотой знак 3 3 серебряных знака 14 14 бронзовых знаков
Можете помочь с этим.В JS не силен
22 фев 2019 в 12:19
- javascript
- jquery
- таймер
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как перезапустить таймер в C: полное руководство для начинающих
Узнайте, как перезапустить таймер в c с помощью функций setitimer и alarm. Приведенные коды и примеры помогут вам освоить эту тему легко и быстро.
Таймеры — один из самых важных инструментов для работы с временем в языке С. Иногда возникает необходимость перезапустить таймер для повторного использования. Однако, это может вызвать некоторые трудности для новичков в программировании. В данной статье мы поговорим о простом и эффективном способе перезапуска таймера.
Первый способ — установка счетчика таймера в ноль. Этот метод наиболее эффективен и предельно прост, но используется в основном, если масштабирование не является критически важным. Если же нужно сохранить точность времени, необходим другой способ.
Второй способ — использование режима «Clear On Compare Match». Этот режим означает, что таймер очищается при достижении определенного порога. Таким образом, мы можем перезапустить таймер, задав новое значение для порога и снова использовать его для отсчета времени. Данный метод намного точнее, но требует больше ресурсов.
Шаг 1: Отключение таймера

Перед тем, как перезапустить таймер в C, необходимо отключить его. Это можно сделать при помощи функции timeKillEvent(), которая принимает идентификатор таймера в качестве аргумента.
Для начала необходимо объявить переменную, в которую будет сохранен идентификатор таймера:
Читать далее«Знак больше и меньше в математике: картинки и уроки для понимания направления» — Научитесь правильно использовать знаки больше и меньше в математике с помощью понятных картинок и подробных уроков. Узнайте, в какую сторону обращается каждый из этих знаков и как это влияет на решение уравнений и неравенств.
Далее, необходимо определить период таймера и запустить его:
timer = timeSetEvent(tc.wPeriodMin, tc.wPeriodMin, &timerProc, 0, TIME_PERIODIC);
Если необходимо остановить таймер, то необходимо воспользоваться функцией timeKillEvent():
После выполнения этой команды таймер будет отключен.
Шаг 2: Сброс значения таймера

Чтобы сбросить значение таймера, нужно присвоить начальное значение переменной, которая является основой для работы таймера. Обычно это переменная типа int или long, устанавливаемая в ноль или другое начальное значение.
Читать далее«Как центрировать заголовок на сайте: правила установки в HTML» — в формате Как центрировать заголовок на сайте: правила установки в HTML.
К примеру, если у вас есть переменная timer_count, которая хранит значение прошедшего времени, для сброса ее значения необходимо написать:
timer_count = 0;
Если вы используете функцию time(), для определения текущего времени, то ее результат также может быть использован для сброса значения таймера. Например:
timer_count = time(0);
Если вы используете таймер внутри цикла, то значение переменной таймера обычно сбрасывается в начале цикла. Это обеспечивает корректную работу таймера в цикле, без накопления прошедшего времени.
Шаг 3: Перезапуск таймера

После того, как таймер закончил свою работу, его можно перезапустить и продолжить отсчет времени. Для этого необходимо использовать функцию timer_restart(), которая будет выполнена после окончания работы таймера.
time_t start, end;
elapsed = difftime(end, start);
printf(«Таймер закончил свою работу.\n»);
elapsed = difftime(end, start);
printf(«Таймер закончил свою работу.\n»);
Как можно видеть из кода, после того как таймер закончил свою работу, необходимо повторно инициализировать переменные start и elapsed и запустить цикл отсчета времени снова.
При желании, можно использовать бесконечный цикл с условием выхода по нажатию на определенную клавишу при помощи функции getch(). В таком случае, таймер можно будет перезапускать в любое удобное время по желанию пользователя.
Шаг 4: Настройка таймера

Настройка таймера – важный этап его использования. Для этого нужно определить время на таймере и количество повторений таймера.
1. Время на таймере. Введите время в миллисекундах, которое должно пройти до срабатывания таймера. Например, если вы хотите, чтобы таймер срабатывал каждые 30 секунд, время в миллисекундах будет равно 30000.
2. Количество повторений таймера. Определите, сколько раз вы хотите, чтобы таймер срабатывал. Если вы хотите, чтобы таймер работал бесконечно, установите значение «-1».
3. Запустите таймер. После того, как вы настроили нужное время и количество повторений таймера, запустите его, нажав на соответствующую кнопку. Таймер будет начинать отсчет времени и срабатывать по заданным параметрам.
4. Перезапуск таймера. Если вы хотите перезапустить таймер, просто настройте его заново и запустите.
5. Остановка таймера. Если вам нужно остановить таймер, нажмите на соответствующую кнопку. Таймер прекратит работу и перестанет срабатывать.
Когда нужно перезапустить таймер в C?

Перезапуск таймера в C может потребоваться в различных сценариях программирования. Одна из основных причин — это необходимость повторной итерации определенной операции в определенный промежуток времени.
Например, если программа взаимодействует с пользователем, то может понадобиться запуск таймера для отслеживания времени ожидания ответа от пользователя. Если время ожидания превышает определенный порог, то можно перезапустить таймер и начать ожидание снова.
Также перезапуск таймера может быть полезен в случае необходимости запуска циклических процессов, например, обработки данных в режиме реального времени. В этом случае таймер запускается каждый определенный интервал времени и перезапускается после каждой итерации.
Важно помнить, что перезапуск таймера может повлечь за собой сброс всех значений, связанных с таймером, поэтому необходимо тщательно продумать логику работы программы и использовать соответствующие функции и переменные.
Почему стоит использовать этот метод?
Простота и доступность
Описываемый способ перезапуска таймера в C является одним из самых простых и доступных. Он основан на использовании функции clock() из стандартной библиотеки C и не требует особых знаний или умений.
Эффективность и точность
При помощи описываемого метода можно добиться высокой точности измерения времени. Функция clock() возвращает время, прошедшее с начала выполнения программы, в тактовых единицах процессора. Это означает, что точность замеров зависит от частоты процессора и может быть очень высокой.
Универсальность
Описанный способ перезапуска таймера подходит для широкого круга задач. Он может быть использован для организации интервальных таймеров, измерения производительности или простого отсчета времени внутри программы.
Надежность
В отличие от других способов перезапуска таймера, описанный метод не требует привлечения дополнительных системных ресурсов или использования специальных библиотек. Это повышает его надежность и устойчивость к возможным ошибкам или сбоям в работе программы.
Простота поддержки и сопровождения
Описанный способ перезапуска таймера легко понимаем и может быть быстро и просто адаптирован под различные задачи. Это упрощает его поддержку и сопровождение в будущем.
Могут ли возникнуть проблемы при перезапуске таймера?
Перезапуск таймера — это распространенная операция в программировании, но возникают определенные проблемы, которые могут возникнуть при перезапуске таймера. Одна из основных проблем — задержка запуска. Если таймер не остановится, прежде чем перезапустить его, то новый таймер может начать выполняться, не дожидаясь завершения предыдущего. Это может привести к тому, что один и тот же процесс выполняется дважды, что может нарушить различные настройки и привести к ошибкам.
Другая проблема, которая может возникнуть при перезапуске таймера — это не точность. Таймеры основаны на количестве тактов системного времени, которое прошло с определенного момента. Это означает, что если прошло более времени, чем предполагалось, таймер может неправильно индицировать время окончания.
Также следует помнить, что перезапуск таймера может ухудшить производительность программы. Каждый раз, когда вы перезапускаете таймер, ваша программа должна производить больше вычислений для того, чтобы остановить и запустить его. Это может привести к снижению скорости вашей программы и ухудшению ее производительности.
Тем не менее, если вы предусмотрите все эти проблемы и используете правильные методы перезапуска таймера, вы сможете избежать этих проблем и получить точный и эффективный результат.
Вопрос-ответ:
Как перезапустить таймер в C?
Чтобы перезапустить таймер в С, необходимо остановить его и заново запустить. Для этого можно использовать функцию stop() и start() соответственно.
Как остановить таймер в С?
Для остановки таймера в С используется функция stop(). Она останавливает выполнение таймера, сохраняя его текущее состояние.
Как установить интервал таймера в С?
Для установки интервала таймера в С используется функция setInterval(). Она принимает два аргумента: функцию, которую нужно выполнить и интервал времени в миллисекундах, через который нужно вызывать данную функцию.
Как изменить интервал таймера в С?
Для изменения интервала таймера в С нужно остановить его при помощи функции stop(), затем изменить интервал, используя функцию setInterval(), и заново запустить таймер при помощи функции start().
Как узнать, сколько времени прошло с момента запуска таймера в С?
Чтобы узнать, сколько времени прошло с момента запуска таймера в С, можно использовать свойство elapsed() объекта QElapsedTimer. Оно возвращает количество миллисекунд, прошедших с момента запуска таймера.
Какой максимальный интервал можно задать таймеру в С?
Максимальный интервал, который можно задать таймеру в С, равен максимальному значению типа qint32 (2147483647). Это означает, что максимальный интервал составляет примерно 24 суток.
Какой минимальный интервал можно задать таймеру в С?
Минимальный интервал, который можно задать таймеру в С, зависит от производительности компьютера. Однако обычно минимальный интервал составляет примерно 1 миллисекунду.
Планирование: setTimeout и setInterval
Мы можем вызвать функцию не в данный момент, а позже, через заданный интервал времени. Это называется «планирование вызова».
Для этого существуют два метода:
- setTimeout позволяет вызвать функцию один раз через определённый интервал времени.
- setInterval позволяет вызывать функцию регулярно, повторяя вызов через определённый интервал времени.
Эти методы не являются частью спецификации JavaScript. Но большинство сред выполнения JS-кода имеют внутренний планировщик и предоставляют доступ к этим методам. В частности, они поддерживаются во всех браузерах и Node.js.
setTimeout
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], . );
func|code Функция или строка кода для выполнения. Обычно это функция. По историческим причинам можно передать и строку кода, но это не рекомендуется. delay Задержка перед запуском в миллисекундах (1000 мс = 1 с). Значение по умолчанию – 0. arg1 , arg2 … Аргументы, передаваемые в функцию
Например, данный код вызывает sayHi() спустя одну секунду:
function sayHi() < alert('Привет'); >setTimeout(sayHi, 1000);
function sayHi(phrase, who) < alert( phrase + ', ' + who ); >setTimeout(sayHi, 1000, "Привет", "Джон"); // Привет, Джон
Если первый аргумент является строкой, то JavaScript создаст из неё функцию.
Это также будет работать:
setTimeout("alert('Привет')", 1000);
Но использование строк не рекомендуется. Вместо этого используйте функции. Например, так:
setTimeout(() => alert('Привет'), 1000);
Передавайте функцию, но не запускайте её
Начинающие разработчики иногда ошибаются, добавляя скобки () после функции:
// неправильно! setTimeout(sayHi(), 1000);
Это не работает, потому что setTimeout ожидает ссылку на функцию. Здесь sayHi() запускает выполнение функции, и результат выполнения отправляется в setTimeout . В нашем случае результатом выполнения sayHi() является undefined (так как функция ничего не возвращает), поэтому ничего не планируется.
Отмена через clearTimeout
Вызов setTimeout возвращает «идентификатор таймера» timerId , который можно использовать для отмены дальнейшего выполнения.
Синтаксис для отмены:
let timerId = setTimeout(. ); clearTimeout(timerId);
В коде ниже планируем вызов функции и затем отменяем его (просто передумали). В результате ничего не происходит:
let timerId = setTimeout(() => alert("ничего не происходит"), 1000); alert(timerId); // идентификатор таймера clearTimeout(timerId); alert(timerId); // тот же идентификатор (не принимает значение null после отмены)
Как мы видим из вывода alert , в браузере идентификатором таймера является число. В других средах это может быть что-то ещё. Например, Node.js возвращает объект таймера с дополнительными методами.
Повторюсь, что нет единой спецификации на эти методы, поэтому такое поведение является нормальным.
Для браузеров таймеры описаны в разделе таймеров стандарта HTML5.
setInterval
Метод setInterval имеет такой же синтаксис как setTimeout :
let timerId = setInterval(func|code, [delay], [arg1], [arg2], . );
Все аргументы имеют такое же значение. Но отличие этого метода от setTimeout в том, что функция запускается не один раз, а периодически через указанный интервал времени.
Чтобы остановить дальнейшее выполнение функции, необходимо вызвать clearInterval(timerId) .
Следующий пример выводит сообщение каждые 2 секунды. Через 5 секунд вывод прекращается:
// повторить с интервалом 2 секунды let timerId = setInterval(() => alert('tick'), 2000); // остановить вывод через 5 секунд setTimeout(() => < clearInterval(timerId); alert('stop'); >, 5000);
Во время показа alert время тоже идёт
В большинстве браузеров, включая Chrome и Firefox, внутренний счётчик продолжает тикать во время показа alert/confirm/prompt .
Так что если вы запустите код выше и подождёте с закрытием alert несколько секунд, то следующий alert будет показан сразу, как только вы закроете предыдущий. Интервал времени между сообщениями alert будет короче, чем 2 секунды.
Вложенный setTimeout
Есть два способа запускать что-то регулярно.
Один из них setInterval . Другим является вложенный setTimeout . Например:
/** вместо: let timerId = setInterval(() => alert('tick'), 2000); */ let timerId = setTimeout(function tick() < alert('tick'); timerId = setTimeout(tick, 2000); // (*) >, 2000);
Метод setTimeout выше планирует следующий вызов прямо после окончания текущего (*) .
Вложенный setTimeout – более гибкий метод, чем setInterval . С его помощью последующий вызов может быть задан по-разному в зависимости от результатов предыдущего.
Например, необходимо написать сервис, который отправляет запрос для получения данных на сервер каждые 5 секунд, но если сервер перегружен, то необходимо увеличить интервал запросов до 10, 20, 40 секунд… Вот псевдокод:
let delay = 5000; let timerId = setTimeout(function request() < . отправить запрос. if (ошибка запроса из-за перегрузки сервера) < // увеличить интервал для следующего запроса delay *= 2; >timerId = setTimeout(request, delay); >, delay);
А если функции, которые мы планируем, ресурсоёмкие и требуют времени, то мы можем измерить время, затраченное на выполнение, и спланировать следующий вызов раньше или позже.
Вложенный setTimeout позволяет задать задержку между выполнениями более точно, чем setInterval .
Сравним два фрагмента кода. Первый использует setInterval :
let i = 1; setInterval(function() < func(i); >, 100);
Второй использует вложенный setTimeout :
let i = 1; setTimeout(function run() < func(i); setTimeout(run, 100); >, 100);
Для setInterval внутренний планировщик будет выполнять func(i) каждые 100 мс:
Реальная задержка между вызовами func с помощью setInterval меньше, чем указано в коде!
Это нормально, потому что время, затраченное на выполнение func , использует часть заданного интервала времени.
Вполне возможно, что выполнение func будет дольше, чем мы ожидали, и займёт более 100 мс.
В данном случае движок ждёт окончания выполнения func и затем проверяет планировщик и, если время истекло, немедленно запускает его снова.
В крайнем случае, если функция всегда выполняется дольше, чем задержка delay , то вызовы будут выполняться без задержек вообще.
Ниже представлено изображение, показывающее процесс работы рекурсивного setTimeout :
Вложенный setTimeout гарантирует фиксированную задержку (здесь 100 мс).
Это потому, что новый вызов планируется в конце предыдущего.
Сборка мусора и колбэк setTimeout/setInterval
Когда функция передаётся в setInterval/setTimeout , на неё создаётся внутренняя ссылка и сохраняется в планировщике. Это предотвращает попадание функции в сборщик мусора, даже если на неё нет других ссылок.
// функция остаётся в памяти до тех пор, пока планировщик обращается к ней setTimeout(function() , 100);
Для setInterval функция остаётся в памяти до тех пор, пока не будет вызван clearInterval .
Есть и побочный эффект. Функция ссылается на внешнее лексическое окружение, поэтому пока она существует, внешние переменные существуют тоже. Они могут занимать больше памяти, чем сама функция. Поэтому, если регулярный вызов функции больше не нужен, то лучше отменить его, даже если функция очень маленькая.
setTimeout с нулевой задержкой
Особый вариант использования: setTimeout(func, 0) или просто setTimeout(func) .
Это планирует вызов func настолько быстро, насколько это возможно. Но планировщик будет вызывать функцию только после завершения выполнения текущего кода.
Так вызов функции будет запланирован сразу после выполнения текущего кода.
Например, этот код выводит «Привет» и затем сразу «Мир»:
setTimeout(() => alert("Мир")); alert("Привет");
Первая строка помещает вызов в «календарь» через 0 мс. Но планировщик проверит «календарь» только после того, как текущий код завершится. Поэтому «Привет» выводится первым, а «Мир» – после него.
Есть и более продвинутые случаи использования нулевой задержки в браузерах, которые мы рассмотрим в главе Событийный цикл: микрозадачи и макрозадачи.
Минимальная задержка вложенных таймеров в браузере
В браузере есть ограничение на то, как часто внутренние счётчики могут выполняться. В стандарте HTML5 говорится: «после пяти вложенных таймеров интервал должен составлять не менее четырёх миллисекунд.».
Продемонстрируем в примере ниже, что это означает. Вызов setTimeout повторно вызывает себя через 0 мс. Каждый вызов запоминает реальное время от предыдущего вызова в массиве times . Какова реальная задержка? Посмотрим:
let start = Date.now(); let times = []; setTimeout(function run() < times.push(Date.now() - start); // запоминаем задержку от предыдущего вызова if (start + 100 < Date.now()) alert(times); // показываем задержку через 100 мс else setTimeout(run); // если нужно ещё запланировать >); // пример вывода: // 1,1,1,1,9,15,20,24,30,35,40,45,50,55,59,64,70,75,80,85,90,95,100
Первый таймер запускается сразу (как и указано в спецификации), а затем задержка вступает в игру, и мы видим 9, 15, 20, 24. .
Аналогичное происходит при использовании setInterval вместо setTimeout : setInterval(f) запускает f несколько раз с нулевой задержкой, а затем с задержкой 4+ мс.
Это ограничение существует давно, многие скрипты полагаются на него, поэтому оно сохраняется по историческим причинам.
Этого ограничения нет в серверном JavaScript. Там есть и другие способы планирования асинхронных задач. Например, setImmediate для Node.js. Так что это ограничение относится только к браузерам.
Итого
- Методы setInterval(func, delay, . args) и setTimeout(func, delay, . args) позволяют выполнять func регулярно или только один раз после задержки delay , заданной в мс.
- Для отмены выполнения необходимо вызвать clearInterval/clearTimeout со значением, которое возвращают методы setInterval/setTimeout .
- Вложенный вызов setTimeout является более гибкой альтернативой setInterval . Также он позволяет более точно задать интервал между выполнениями.
- Планирование с нулевой задержкой setTimeout(func,0) или, что то же самое, setTimeout(func) используется для вызовов, которые должны быть исполнены как можно скорее, после завершения исполнения текущего кода.
- Браузер ограничивает 4-мя мс минимальную задержку между пятью и более вложенными вызовами setTimeout , а также для setInterval , начиная с 5-го вызова.
Обратим внимание, что все методы планирования не гарантируют точную задержку.
Например, таймер в браузере может замедляться по многим причинам:
- Перегружен процессор.
- Вкладка браузера в фоновом режиме.
- Работа ноутбука от аккумулятора.
Всё это может увеличивать минимальный интервал срабатывания таймера (и минимальную задержку) до 300 или даже 1000 мс в зависимости от браузера и настроек производительности ОС.
Задачи
Вывод каждую секунду
важность: 5
Напишите функцию printNumbers(from, to) , которая выводит число каждую секунду, начиная от from и заканчивая to .
Сделайте два варианта решения.
- Используя setInterval .
- Используя рекурсивный setTimeout .
Измерение прошедшего времени с автозапуском
С помощью описанной ниже процедуры можно автоматически запустить таймер сразу же после пятисекундного отсчета.
1. Перейдите в режим «Таймер».
2. Нажмите кнопку (A), чтобы выбрать автозапуск.

3. Стандартное действие приведено ниже.

- Чтобы остановить текущую операцию обратного отсчета, сначала нажмите кнопку (E) для ее приостановки, а затем нажмите кнопку (A). Будет выполнен сброс показаний таймера и восстановлено время запуска.