c语言的sound函数和delay函数的问题

来源:百度知道 编辑:UC知道 时间:2024/09/24 05:34:22
这是我的代码:

#include <dos.h>
main()
{
int spre;
for (spre = 50;spre <= 5000;spre += 50)
{
sound(spre);
delay(10000);
}
return 0;
}
不知道怎么的,不是说delay后面的数代表毫秒吗,这样的话我的都已经设置为十秒了啊,怎么还是两秒钟的样子就运行完了,就是改为1000000,都要不了几秒就运行玩了,各位大大,帮帮忙,这是什么回事啊,编译器是天空下的TC2.01,应该没有问题,请大家帮帮忙啊!!!

函数:
void delay(uint i)
{
while(i)i--;
}

这样的延迟设计很不好,因为受影响的因素太多。
首先就是机器的CPU频率,快的CPU执行i--这句的机器时间短,慢的机器就很慢。
其次是当前机器的负荷情况,负荷较重时,系统给当前进程分配的CPU时间少,执行这些语句的机会就少,延迟就增加了。
影响因素还有很多在此不再列举。

做延迟程序主要有以下几种方法:
1. 定时器法
用CWnd::SetTimer()函数设置定时器,当定时时间到时发送WM_TIMER消息触发CWnd::OnTimer()函数,重载它把自己的代码放进去。
SetTimer()参数为毫秒,此方法定时不高,受系统负荷影响。
2. 休眠法
调用系统API函数Sleep(2000); 参数单位是毫秒,2000代表2秒。
此方法主要收到当前系统负荷的影响,定时不太准确
3. 时刻比较法
定义两个CTime变量,一个用于记录起始时刻,另一个放在循环体中不断刷新当前时刻,并减去起始时刻,自己计算是否到时间了。
此方法因CTime变量只能获取秒级的时刻,且收到系统负荷影响,精度也较低。
4. CPU滴答查询法
利用两个API函数QueryPerformanceFrequency()和QueryPerformanceCounter()分别获取CPU的频率和CPU滴答数,依时刻比较法自己计算时刻差值。
因为CPU滴答数是等于CPU的机器周期的,所以是Windows系统里最最精确的计时方法了。现在的CPU主频都是GHz级的,因此理论上计时精度可以到纳秒。
只要系统负荷不太重,此法可用于极其精确的延时程序。

因为Windows并不是实时操作系统,因此对于太过精确的计时,还是无能为力的。