Задержка времени (пауза, тайм-аут) в бат-файле
Вот, нашёл в Сети рабочий пример для устройства задержки времени
(пауза, тайм-аут) при выполнении команды в bat-файле:
echo wscript.Sleep 30000>»%temp%\sleep30.vbs»
cscript //nologo «%temp%\sleep30.vbs»
del «%temp%\sleep30.vbs»
Работает в любой ОС Windows, аж бегом
Зачем нужна задержка (пауза, тайм-аут) при выполнении команды в bat-файле?
У всех – по-разному.
Лично мне она (пауза) понадобилась вот для чего:
– Взял простенький bat-файл для очистки временных папок и бросил его в АВТОЗАГРУЗКУ
Прикололся, типа – чтобы этот батничек чистил временные каталоги при запуске системы.
Текст батника вытащил из стандартного Total Commander-a:
cmd /c title Очистка временной папки &cd/d %temp%&rd/s/q %temp% 2>nul &cd/d %tmp%&rd/s/q %tmp% 2>nul &cd/d C:\Windows\Prefetch &del *.pf 2>nul &cd/d C:\Windows\Temp&rd/s/q c:\windows\temp 2>nul
Всё-бы ничего, да только такая процедура очистки временных папок при загрузке –
сносит полезные файлы и система выдаёт окно ошибки
Досадно.
Однако, устройство паузы в 30 сек. решило всю проблему.
И система грузится, и папки темпов — чистятся.
Полный текст bat-файла стал теперь таким:
echo wscript.Sleep 30000>»%temp%\sleep30.vbs»
cscript //nologo «%temp%\sleep30.vbs»
del «%temp%\sleep30.vbs»
cmd /c title Очистка временной папки &cd/d %temp%&rd/s/q %temp% 2>nul &cd/d %tmp%&rd/s/q %tmp% 2>nul &cd/d C:\Windows\Prefetch &del *.pf 2>nul &cd/d C:\Windows\Temp&rd/s/q c:\windows\temp 2>nul
Прим. Лошади понятно, что изменив цифру 30 на своё значение,
можно получить другие величины паузы в секундах в bat-файле.
Начиная с VISTA, в операционных системах семейства Windows присутствует команда TIMEOUT. Эта команда принимает значение таймаута, равного фиксированному периоду времени ожидания (в секундах) до выполнения команды или ожидание до нажатия клавиши. Имеется также параметр, зaдающий игнорирование нажатий клавиш.
Синтаксис
TIMEOUT [/T] 50 [/NOBREAK]
Параметры
/T 50 Таймаут = 50 сек. Время ожидания в секундах. Допустимый интервал: от -1 до 99999 секунд. Значение, равное -1 задает неограниченное время ожидания до нажатия клавиши. /NOBREAK Игнорировать нажатия клавиш, ждать указанное время. /? Отображение справки в командной строке.
TIMEOUT /?
TIMEOUT /T 10
TIMEOUT /T 300 /NOBREAK
TIMEOUT /T -1
Весь текст примера можно внести в bat-файл,
запустить и посмотреть, как это работает.
Впечатляет.
- Выключение компьютера по расписанию
- Восстановление файла конфигурации загрузки (BCD)
- Низкоуровневое форматирование флешки
- Восстановление MBR жёсткого диска
- Создание, удаление и работа разделов флешки
- Ротатор баннеров
- Как включить и выключить гибернацию
Site
- 301 редирект | Permanent Redirect
- Права доступа (chmod) вида 777
- Таблица символов Юникод в HTML
- Якорь HTML | Закладка на веб-странице
- Списки HTML
- Списки HTML | Обтекание картинок
- Списки HTML | Оформление маркеров (буллетов
Windows
- Программы для выключения компьютера скачать
- Выключение компьютера по расписанию
- Задержка времени (пауза, тайм-аут) в бат-файле
- Word и Excel | Автоматическая нумерация ячеек таблицы
- Word | Разорвать и соединить таблицу
- Word | Вставить диаметр, ударение, апостроф
- Excel | Перенос строки в ячейке
- Word | Убрать горизонтальную линию
Записки алкоголика
- Позвонить оператору Водафон-Украина (МТС, UMC)
- Водафон, Киевстар, Лайф | Код USSD-запросов
- Заработок на буксах | Философия успеха
- Заработок на буксах | Мифы и реальность
Как сделать таймер в блокноте
Если Вы скачали или приобрели надстройку PLEX для Microsoft Excel и у Вас есть вопросы или пожелания — Вам сюда.
Нормализация — Plex (Пользователь Google) 19.11.2023 21:35:50
Оффтопьте на здоровье
ячейки с зада 🙂 (Бахтиёр) 23.11.2023 09:29:35
Обсуждение функционала, правил и т.д.
Некорректная работа сс. (Alien Sphinx) 09.11.2023 10:04:40
Сейчас на форуме
Сегодня отмечают день рождения andrey.shep ( 43 ), quende ( 35 ), MakkAMokkoZZZ ( 36 ), lishenpo Лишенко ( 32 )
Всего зарегистрированных пользователей: 129517
Приняло участие в обсуждении: 47761
Всего тем: 151517
Всего сообщений: 1193025
есть новые сообщения
нет новых сообщений
© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru
Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.
| ООО «Планета Эксел» ИНН 7735603520 ОГРН 1147746834949 |
ИП Павлов Николай Владимирович ИНН 633015842586 ОГРНИП 310633031600071 |
Как сделать таймер
На многих сайтах можно увидеть таймер с обратным отсчетом до наступления какого-то определенного события. Это может быть время окончания действия скидок или время, оставшееся до Нового года. Такие таймеры – отличный рекламный ход, стимулирующий активность покупателей/поставщиков, а также неплохое интерактивное разнообразие для сайта.
Статьи по теме:
- Как сделать таймер
- Как отключить компьютер по таймеру
- Как в игре убрать время
Вам понадобится
- — скрипт таймера обратного отсчета.
Инструкция
Чтобы установить такой таймер на вашем сайте сначала скачайте скрипт таймера обратного отсчета. Затем настройте в нем два параметра: дату отсчета и соответствующую надпись, которая будет показана при наступлении этой даты.
Открыв скачанный архив, вы обнаружите 2 файла: один содержит скрипт countdown.js, а другой служит примером страницы, к которой и будет подключен этот скрипт — index.html. Сначала извлеките файлы из архива.
Используйте «Блокнот» для редактирования файла-скрипта. Для того чтобы открыть указанный файл в «Блокноте», правой кнопкой мышки кликните по нему. В появившемся меню выберете пункт «Открыть», затем выберите «с помощью – Блокнот».
Отредактируйте первую строку, находящуюся в самом начале файла: var eventstr = «C новым годом!». Эта надпись будет выведена по окончании отсчета. Вторая строка с датой отсчета расположена в конце файла и выглядит следующим образом: CountDowndmn(2011,1,1) в формате год, месяц, день.
Отредактируйте фрагмент скрипта, который также находится в конце файла, немного выше даты отсчета: countdownid.innerHTML= «До Нового года осталось:» «+dday+ » » +ddaystr+», «+dhour+» «+dhourstr+», «+dmin+» «+dminstr+» и «+dsec+» «+dsecstr.
Сохраните полученный файл и поместите его в директорию, где находится страница вашего сайта, на которой будет размещен таймер. Иными словами, файл страницы с таймером и файл скрипта, должны быть в одной и той же директории.
Далее в удобном месте для размещения таймера, в коде вашей страницы, поместите 2 строки:
DIV align= «center»
Первая строка отвечает за команду о выводе таймера. Вторая – за подключение созданного скрипта.
Проверьте работу вашего таймера. Если все сделано верно, то вы увидите обратный отсчет в нужном месте страницы вашего сайта.
Видео по теме
Совет полезен?
Статьи по теме:
- Как пользоваться таймером
- Как узнать время выключения компьютера
- Как поставить таймер на компьютере
Добавить комментарий к статье
Похожие советы
- Как включить таймер
- Как поставить таймер на фотоаппарате
- Как написать программу часы
- Как собрать таймер
- Как сделать программу-секундомер на Паскале
- Как сделать таймер в Minecraft?
- Как выключить компьютер по таймеру
- Как написать программу в блокноте
- Как отключить таймер
- Как настроить отложенную отправку электронного письма
- Как отключить звук затвора
- Как выключить ноутбук
- Как выставить дату на фотоаппарате
- Как установить напоминание на экране компьютера
- Как поставить таймер на выключение компьютера на Windows 7
- Как остановить таймер в игре
- Как вывести часы на рабочий стол
- Как написать код на картинке
- Как определить имя компьютера по ip адресу
- Как вывести на экран сообщение
- Как пользоваться Google-калькулятором
- Как правильно выключить компьютер
Системный таймер в Windows: большое изменение
Поведение планировщика Windows значительно изменилось в Windows 10 2004 без каких-либо предупреждений и изменения документации. Вероятно, это поломает несколько приложений. Такое происходит не первый раз, но эта перемена посерьёзнее.
Если вкратце, то вызовы timeBeginPeriod из одного процесса теперь влияют на другие процессы меньше, чем раньше, хотя эффект ещё присутствует.
Думаю, что новое поведение — это по сути улучшение, но оно странное, и заслуживает того, чтобы быть задокументированным. Честно предупреждаю — у меня только результаты собственных экспериментов, поэтому могу только догадываться о целях и каких-то побочных эффектах этого изменения. Если какие-либо из моих выводов неверны, пожалуйста, дайте знать.
Прерывания таймера и смысл их существования

Во-первых, немного контекста о дизайне операционных систем. Желательно, чтобы программа могла засыпать, а позже — просыпаться. На самом деле это не следует делать очень часто — потоки обычно ждут событий, а не таймеров, — но иногда необходимо. Итак, в Windows есть функция Sleep — передайте ей желаемую продолжительность сна в миллисекундах, и она разбудит процесс:
Стоит подумать о том, как это реализуется. В идеале при вызове Sleep(1) процессор переходит в спящий режим. Но как операционная система разбудит поток, если процессор спит? Ответ — аппаратные прерывания. ОС программирует микросхему — аппаратный таймер, который затем запускает прерывание, которое пробуждает процессор, и ОС затем запускает ваш поток.
Функции WaitForSingleObject и WaitForMultipleObjects также имеют значения таймаута, и эти таймауты реализуются с использованием того же механизма.
Если много потоков ждут таймеров, то ОС может запрограммировать аппаратный таймер на индивидуальное время для каждого потока, но это обычно приводит к тому, что потоки просыпаются в случайное время, а процессор так нормально и не засыпает. Энергоэффективность CPU сильно зависит от времени его сна (нормальное время от 8 мс), и случайные пробуждения тому не способствуют. Если несколько потоков синхронизируют или объединяют свои ожидания таймера, то система становится более энергоэффективной.
Существует множество способов объединения пробуждений, но основной механизм в Windows — глобальное прерывание таймера, тикающего с постоянной скоростью. Когда поток вызывает Sleep(n), то ОС запланирует запуск потока сразу после первого прерывания таймера. Это означает, что поток может в конечном итоге проснуться немного позже, но Windows — это не ОС реального времени, она вообще не гарантирует определённое время пробуждения (в это время ядра процессора могут быть заняты), поэтому вполне нормально проснуться чуть позже.
Интервал между прерываниями таймера зависит от версии Windows и железа, но на всех моих машинах он по умолчанию составлял 15,625 мс (1000 мс/64). Это означает, что если вызвать Sleep(1) в какое-то случайное время, то процесс будет разбужен где-то между 1,0 мс и 16,625 мс в будущем, когда сработает следующее прерывание глобального таймера (или через одно, если это сработало слишком рано).
Короче говоря, природа задержек таймера такова, что (если только не используется активное ожидание процессора, а его, пожалуйста, не используйте) ОС может пробуждать потоки только в определённое время с помощью прерываний таймера, а Windows использует регулярные прерывания.
Некоторым программам не подходит такой большой разброс в задержках ожидания (WPF, SQL Server, Quartz, PowerDirector, Chrome, Go Runtime, многие игры и т. д.). К счастью, они могут решить проблему с помощью функции timeBeginPeriod, которая позволяет программе запросить меньший интервал. Есть также функция NtSetTimerResolution, которая позволяет устанавливать интервал меньше миллисекунды, но она редко используется и никогда не требуется, поэтому не буду больше её упоминать.
Десятилетия безумия
Вот сумасшедшая вещь: timeBeginPeriod может вызвать любая программа, и она изменяет интервал прерывания таймера, при этом прерывание таймера — это глобальный ресурс.
Представим, что процесс А находится в цикле с вызовом Sleep(1). Это неправильно, но это так, и по умолчанию он просыпается каждые 15,625 мс, или 64 раза в секунду. Затем появляется процесс B и вызывает timeBeginPeriod(2). Это заставляет таймер срабатывать чаще, и внезапно процесс А просыпается 500 раз в секунду вместо 64-х раз в секунду. Это безумие! Но именно так всегда работала Windows.
В этот момент, если бы появился процесс C и вызвал timeBeginPeriod(4), это ничего бы не изменило — процесс A продолжал бы просыпаться 500 раз в секунду. В такой ситуации правила устанавливает не последний вызов, а вызов с минимальным интервалом.
Таким образом, вызов timeBeginPeriod от любой работающей программы может установить глобальный интервал прерывания таймера. Если эта программа завершает работу или вызывает timeEndPeriod, то вступает в силу новый минимум. Если одна программа вызывает timeBeginPeriod(1), то теперь это интервал прерывания таймера для всей системы. Если одна программа вызывает timeBeginPeriod(1), а другая timeBeginPeriod(4), то всеобщим законом становится интервал прерывания таймера в одну миллисекунду.

Это имеет значение, потому что высокая частота прерываний таймера — и связанная с ней высокая частота планирования потоков — может впустую расходовать значительную мощность CPU, как обсуждалось здесь.
Одним из приложений, которому необходимо планирование на основе таймера, является веб-браузер. В стандарте JavaScript есть функция setTimeout, которая просит браузер вызвать функцию JavaScript через несколько миллисекунд. Для реализации этой и других функций Chromium использует таймеры (в основном WaitForSingleObject с таймаутами, а не Sleep). Это часто требует повышенной частоты прерываний таймера. Чтобы это не слишком сказывалось на времени автономной работы, Chromium недавно модифицировали таким образом, чтобы при работе от батареи частота прерываний таймера не превышала 125 Гц (интервал 8 мс).
timeGetTime
Функция timeGetTime (не путать с GetTickCount) возвращает текущее время, обновлённое прерыванием таймера. Процессоры исторически не очень хороши в ведении точного времени (их часы специально колеблются, чтобы не служить FM-передатчиками, и по другим причинам), поэтому для поддержания точного времени CPU часто полагаются на отдельные генераторы тактовых импульсов. Чтение с этих чипов стоит дорого, поэтому Windows поддерживает 64-битный счётчик времени в миллисекундах, обновляемый прерыванием таймера. Этот таймер хранится в общей памяти, поэтому любой процесс может дёшево считывать оттуда текущее время, не обращаясь к генератору тактовых импульсов. timeGetTime вызывает ReadInterruptTick, который по сути просто считывает этот 64-битный счётчик. Все просто!
Поскольку счётчик обновляется прерыванием таймера, мы можем его отследить и найти частоту прерывания таймера.
Новая недокументированная реальность
С выпуском Windows 10 2004 (апрель 2020 года) некоторые из этих механизмов слегка изменились, но очень запутанным образом. Сначала появились сообщения, что timeBeginPeriod больше не работает. На самом деле всё оказалось куда сложнее.
Первые эксперименты дали смешанные результаты. Когда я запустил программу с вызовом timeBeginPeriod(2), то clockres показал интервал таймера 2,0 мс, но отдельная тестовая программа с циклом Sleep(1) просыпалась около 64 раз в секунду вместо 500 раз, как в предыдущих версиях Windows.
Научный эксперимент
Тогда я написал пару программ для изучения поведения системы. Одна программа (change_interval.cpp) просто сидит в цикле, вызывая timeBeginPeriod с интервалами от 1 до 15 мс. Она удерживает каждый интервал в течение четырёх секунд, а затем переходит к следующему, и так по кругу. Пятнадцать строк кода. Легко.
Другая программа (measure_interval.cpp) запускает несколько тестов для проверки, как её поведение изменяется при изменении change_interval.cpp. Программа отслеживает три параметра.
- Она спрашивает ОС, каково текущее разрешение глобального таймера, используя NtQueryTimerResolution.
- Она измеряет точность timeGetTime, вызывая его в цикле до тех пор, пока возвращаемое значение не изменится — и отслеживая величину, на которую оно изменилось.
- Она измеряет задержку Sleep(1), вызывая его в цикле в течение секунды и подсчитывая количество вызовов. Средняя задержка является просто обратной величиной числа итераций.

Это означает, что timeBeginPeriod по-прежнему устанавливает интервал глобального таймера во всех версиях Windows. Из результатов timeGetTime() можно сказать, что прерывание срабатывает с такой скоростью по крайней мере на одном ядре процессора, и время обновляется. Обратите также внимание, что 2.0 в первой строке для 1909 года тоже было 2.0 в Windows XP, затем 1.0 в Windows 7/8, а затем вроде опять вернулось к 2.0?
Однако поведение планировщика резко меняется в Windows 10 2004. Ранее задержка для Sleep(1) в любом процессе просто равнялась интервалу прерывания таймера, за исключением timeBeginPeriod(1), давая такой график:

В Windows 10 2004 соотношение между timeBeginPeriod и задержкой сна в другом процессе (который не вызывал timeBeginPeriod) выглядит странно:

Точная форма левой части графика неясна, но она определённо уходит в противоположную сторону от предыдущего!
Последствия
Как было указано в обсуждении reddit и hacker-news, вероятно, левая половина графика представляет собой попытку максимально точно имитировать «нормальную» задержку, учитывая доступную точность глобального прерывания таймера. То есть с интервалом прерывания 6 миллисекунд задержка происходит примерно на 12 мс (два цикла), а с интервалом прерывания 7 миллисекунд — примерно на 14 мс (два цикла). Однако измерение фактических задержек показывает, что реальность ещё более запутанна. При прерывании таймера, установленном на 7 мс, задержка Sleep(1) в 14 мс даже не самый распространённый результат:

Некоторые читатели могут обвинить случайный шум в системе, но когда частота прерывания таймера 9 мс и выше, шум равен нулю, так что это не может быть объяснением. Попробуйте сами запустить обновлённый код. Особенно противоречивыми кажутся интервалы прерывания таймера от 4 мс до 8 мс. Вероятно, измерения интервалов следует выполнять с помощью QueryPerformanceCounter, поскольку на текущий код беспорядочно влияют изменение правил планирования и изменение точности таймера.
Всё это очень странно, и я не понимаю ни логики, ни реализации. Может, это и ошибка, но я в этом сомневаюсь. Думаю, что за этим стоит сложная логика обратной совместимости. Но самый эффективный способ избежать проблем совместимости — это документировать изменения, желательно заранее, а здесь правки сделаны без какого-либо уведомления.
Это не повлияет на большинство программ. Если процесс хочет более быстрое прерывание таймера, то он сам должен вызвать timeBeginPeriod. Тем не менее, могут возникнуть следующие проблемы:
- Программа может случайно предположить, что у Sleep(1) и timeGetTime одинаковое разрешение, а это теперь не так. Хотя, такое предположение кажется маловероятным.
- Программа может зависеть от маленького разрешения таймера, которого не получает. Было несколько сообщений о такой проблеме в некоторых играх — есть инструмент под названием Windows System Timer Tool и ещё один под названием TimerResolution 1.2. Они «исправляют» эти игры, повышая частоту прерываний таймера. Видимо, эти исправления больше не будут работать или будут работать не так хорошо. Возможно, это заставит разработчиков игр выпустить правильные патчи, но до тех пор изменение вызывает проблемы обратной совместимости.
- В многопроцессной программе главная управляющая программа может повысить частоту прерываний таймера, а затем ожидать, что это повлияет на планирование дочерних процессов. Раньше это было разумное предположение, но теперь оно не работает. Именно так я сам узнал об этой проблеме. Продукт, о котором идёт речь, теперь вызывает timeBeginPeriod в каждом процессе, так что всё в порядке, но несколько месяцев программное обеспечение плохо работало по непонятной причине.
Жертва
Тестовая программа change_interval.cpp работает только в том случае, если никто не запрашивает более высокую частоту прерываний таймера. Поскольку и Chrome, и Visual Studio имеют привычку делать это, мне пришлось проделать большую часть моих экспериментов без доступа в интернет и программируя в блокноте. Кто-то предложил Emacs, но ввязываться в эту дискуссию выше моих сил.
- Системное администрирование
- Разработка под Windows
- Игры и игровые консоли
