1 (изменено: Arigato, 2013-01-01 11:29:03)

Тема: CMD/BAT: задержка в сотых долях секунды

Стандартной команды задержки, типа sleep, в языке сценариев Windows не предусмотрено. Есть множество различных извращенных способов получить хоть какую-то задержку, например, через ping.

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

Код, реализующий задержку в 10 секунд:

@ echo off

:: Задержка в 10 секунд
echo %time%
echo Wait 10 seconds...
call :sleep 1000
echo %time%
pause
exit /b

:sleep
:: Относительно точная пауза в сотых доля секунды
setlocal
call :gettick
set /a finish=%errorlevel%+%1
if %finish% geq 8640000 set finish=0
:slplabel
call :gettick
if %errorlevel% lss %finish% goto slplabel
endlocal & exit /b

:gettick
:: Количество сотых долей секунды, прошедших с начала дня
setlocal
set t=%time: =0%
set /a tick=1%t:~9,2%-100+(1%t:~6,2%-100)*100+(1%t:~3,2%-100)*6000+(1%t:~0,2%-100)*360000
endlocal & exit /b %tick%

Задержка реализована в виде подпрограммы :sleep, получающей единственный параметр - продолжительность задержки в сотых долях секунды. Точность задержки не идеальная, но весьма неплохая. Единственны косяк может возникнуть в момент перехода времени с 23:59 на 00:00.

2

Re: CMD/BAT: задержка в сотых долях секунды

Arigato пишет:

в языке сценариев Windows не предусмотрено.

Arigato, WSH — Windows Script Host. А то, о чём пишете Вы, принято называть пакетными файлами.

Arigato пишет:

типа sleep, … Предлагаю более точный способ задержки,

Вот именно, что не типа «WScript.Sleep», а обычная «заморозка». Приведённый код даёт 100% загрузку одного логического юнита ЦП.

3

Re: CMD/BAT: задержка в сотых долях секунды

alexii пишет:

А то, о чём пишете Вы, принято называть пакетными файлами.

Пусть будет так.

alexii пишет:

Вот именно, что не типа «WScript.Sleep», а обычная «заморозка». Приведённый код даёт 100% загрузку одного логического юнита ЦП.

Есть ли лучший способ относительно точной задержки?

4

Re: CMD/BAT: задержка в сотых долях секунды

Но это только в секундах

timeout /?

Можно вызывать JScript, передавая ему заданное количество миллисекунд. Но и это тоже не точный вариант.

А к чему такая точность?

( 2 * b ) || ! ( 2 * b )

5

Re: CMD/BAT: задержка в сотых долях секунды

timeout нормально решает задачу. Не знал о нем раньше.

Задержка на 10 секунд:

timeout /t 10 /nobreak>nul

6 (изменено: Arigato, 2013-01-05 15:52:08)

Re: CMD/BAT: задержка в сотых долях секунды

timeout хорошо подходит, если нужна длительная задержка. Для коротких задержек вполне можно использовать предложенный мною вариант, тем более, что он дает неплохую точность.
Однако в моем варианте есть ошибка. Способ устранения см. тут: http://forum.script-coding.com/viewtopi … 097#p68097

P.S. Исправил код в первом сообщении, так что теперь там ошибки уже нет. Остается лишь проблема перехода на новые сутки.

P.P.S. timeout отсутствует в Windows XP.

7

Re: CMD/BAT: задержка в сотых долях секунды

Возможно, будет интересно. Задержку в секундах можно сделать также так:

choice /c y /t КОЛИЧЕСТВО_СЕКУНД /d y