怎样在DOS程序中建立一个延时器(delay timer)?

怎样在DOS程序中建立一个延时器(delay timer)?,第1张

我们这些程序员很幸运,因为Microsoft公司的专家认为建立一个独立于硬件的延时器是一个好主意。显然,这样做的目的在于,无论程序运行在什么速度的计算机上,都可产生一段固定的延迟时间。下面的程序说明了如何在DOS中建立一个延时器:

#

include

<stdio.

h>

#

include

%dos.

h>

#

include

<stdlib.

h>

void

main(int

argc,char

**

argv)

{

union

REGS

regs:

unsiged

long

delay

delay

=

atoI(argv[1])

/

*

assume

that

there

is

an

argument

*

/

/

*

multiply

by

1

for

microsecond-granularity

delay

*

/

/

*

multiply

by

1000

for

millisecond-granularity

delay

*

/

/

*

multiply

by

1000000

for

second-granularity

delay

*

/

delay

*

=1000000

regs.

x.

ax

=

0x8600

regs.

x.

cx=

(unsigned

int

)((delay

&

0xFFFF0000L)>>16)

regs.

x.

dx

=

(unsigned

int

)

(delay

&

0xFFFF)

int86

(0x15,

&regs,

&regs)

}

上例通过DOS中断15H的86H功能来实现延时,延迟时间以微秒为单位,因此,上述延时程序认为你可能要使用一个非常大的数字,于是它分别用CX和DX寄存器来接受延时值的高16位和低16位。上述延时程序最多可以延时49.亿微妙---大约等于1.2小时。

上例假设延时值以微秒为单位,它把延时值乘以一百万,因此在命令行中可以输入以秒为单位的延时值。例如,“delay

10”命令将产生10秒的延时。

这个建议你去dos联盟看一下。里面有很多讨论,很详细的。

如只是应用,下面的应该就足够了:

批处理延时方法小结:

1.ping

CODE: [Copy to clipboard]

--------------------------------------------------------------------------------

@echo off

:loop

echo %time%

ping 127.1 -n 2 1>nul

echo %time%

goto loop

内存使用: cmd.exe 1704k

ping.exe 2920k

误差评定: 较高

优点: 代码构造简单

缺点: 内存占用高,延迟时间长的话误差相对较大。

2.还是ping

CODE: [Copy to clipboard]

--------------------------------------------------------------------------------

@echo off

:loop

echo %time%

ping 1 -n 1 -w 1000 2>nul 1>nul

echo %time%

goto loop

内存使用: cmd.exe 1700k

ping.exe 2912k

误差评定: 一般

优点:代码构造简单,时间越长误差越小,精确度较高(50ms)

缺点:内存占用高

3.call

CODE: [Copy to clipboard]

--------------------------------------------------------------------------------

@echo off

:loop

echo %time%

call :delay 1000

echo %time%

goto loop

:delay

set /a num=num + 1

if %num% geq %1 (set num=) &&goto :eof

remfor /l %%i in (1,1,%1) do echo. >nul

goto :eof

内存使用: cmd.exe 1744k [for语句方案]

cmd.exe 1740k [set+goto方案]

误差评定: 很高 (受CPU频率影响非常大,几乎无法准确把握全局延迟时间)

优点: 精确度较高

缺点:不适合需精确把握时间的场合

4.msg

CODE: [Copy to clipboard]

--------------------------------------------------------------------------------

@echo off

:loop

echo %time%

msg %username% /time:20 /w "正在延时,点确定可以取消延时!"

echo %time%

goto loop

内存使用: cmd.exe 1752k

msg.exe 2620k

误差评定: 低

优点: 比较稳定,可中途取消延时,代码构造简单

缺点:内存占用非常大,有窗口d出(优点?缺点?)

5.vbs

CODE: [Copy to clipboard]

--------------------------------------------------------------------------------

@echo off

echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs

:loop

echo %time%

cscript //b //nologo %tmp%\delay.vbs 2000

echo %time%

goto loop

内存使用: cscript.exe 4812k

cmd.exe1708k

误差评定: 很低

优点:精确度最高,使用更灵活,方便

缺点:产生临时文件,内存占用多

End:

1.测试条件有限,以上数据并不具备权威性。

2.关于精确度。

其实只要是参数可以指定时间的命令精确度都比较高,之所以受影响是取决与命令执行的次数,次数越多,精确度越低。而方案5[vbs方案]中之所以说它的精确度最高,可以举个例子: cscript //b //nologo delay.vbs 2036,而方案二由于最小精确度的缘故,还是比方案5要差一点。

3.欢迎大家补充。

简单的是你在加载的程序前加上以下两句VBS脚本

就能起到延时效果,也不会有什么不良后果

echo Wscript.sleep 30000 >y.vbs

call y.vbs &del y.vbs

30000是毫秒也就是30秒

如果是让几点几分这样的运行可以at命令,但必须开

Task Scheduler这个服务才能用AT命令。

把几个命令用&连接就可以说是一起执行

如果把几个命令用&&连接表示&&前的命令执行成功再执行后面的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11225240.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存