原帖地址 http://topic.csdn.net/u/20091030/18/6511df72-0d0c-4a20-b3cb-8b13821db130.html
感谢提问者 BATTLERxANGE
- li45214521
--------
多媒体定时器
驱动中定时器,
驱动中的中断,--------
不太明白,为什么不能通过定时器实现延时,多媒体定时器能够达到1ms的定时间隔,为什么不能实行延时,
难道只有sleep才能实现延时马,既然是定时器,那两次调用的时间间隔都可以作为延时功能的计算,多媒体绝对能够完成你现在的工作,(我是做PC数控的)
如果你只是在用户态实现延时的功能,能够达到1ms的定时器标准的方法,也只不过是使用for循环,不过windows是抢占式操作系统,必然会不稳定.
另外,你既然使用C#,那你应该有驱动程序吧,当然可以利用中断去做这些事情,前提有缓冲区而已,没有比中断更快的事情了.可惜的事,我看不出你有驱动程序.--------
简单的事:命令a
int a=0;
//定时器处理函数,一个周期处理一个命令,第一次执行A 表示输入一个A
// 然后返回 ,然后置相应的命令 a=1后返回,这样a=1就可以执行B的输出操作
OnTime()
{
if(a = 0)
{
A();
a=1;
Break;
}
if(a = 1)
B();
}
//注意:多媒体定时器有严格的限制C# Codes
/// <summary> /// 多媒体事件的委托 /// </summary> private delegate void TimeProc(uint id, uint msg, int user, int dw1, int dw2); /// <summary> /// 多媒体精度测试,详细信息,请参见多媒体sdk /// </summary> [DllImport("Winmm.dll")] private extern static int timeGetDevCaps(out TIMECAPS ptc, int cbtc); /// <summary> /// 设置最小精度,详细信息,请参见多媒体sdk /// </summary> [DllImport("Winmm.dll")] private extern static int timeBeginPeriod(uint timerRes); /// <summary> /// 开始指定定时器事件,这个定时器运行在自己的线程中,激活之后,它将在指定的时间调用回调函数或 /// 有节奏的设置事件对象,详细信息,请参见多媒体sdk /// </summary> [DllImport("Winmm.dll")] private extern static int timeSetEvent(uint delay, uint resolution, TimeProc timeProc, int user, uint fuEvent); /// <summary> /// 清除设置最小精度,详细信息,请参见多媒体sdk /// </summary> [DllImport("Winmm.dll")] private extern static int timeEndPeriod(uint timerRes); /// <summary> /// 取消指定定时器事件,详细信息,请参见多媒体sdk /// </summary> [DllImport("Winmm.dll")] private extern static int timeKillEvent(int timeId);
--------当然你可以在定时器中加入for循环,在for循环的前后执行你想要的结果
这样就可以把1ms分割成更小的执行周期,
不过,你用的for循环并不正确,因为不同的处理器频率不同for循环的时间不同,你应需要查询指令执行周期,然后才能延时你想要的时间,这个内容可以参考,编程之美中的部分内容.--------
多媒体定时器不稳定是你的代码在执行的过程中,执行了超过1ms的周期,
在多媒体回叫函数中调用API都有很强的限制,这种限制就是为了你的执行周期不要超过1ms
,所以我开始就说,在开始就需要缓冲区.另外不要在定时器中调用界面控件的Invoke,需要调用界面控件的BeginInvoke(其实就是PostMessage).
限制:
Applications should not call any system-defined functions from inside a callback function, except for PostMessage, timeGetSystemTime, timeGetTime, timeSetEvent, timeKillEvent, midiOutShortMsg, midiOutLongMsg, and OutputDebugString.
--------
多媒体1ms波动比较大,4-5ms波动比较小
- ChrisAK:
--------
Multimedia SDK里有一组Timer服务.按MSDN的原话说:
Multimedia timer services allow applications to schedule timer events with the greatest resolution (or accuracy) possible for the hardware platform. These multimedia timer services allow you to schedule timer events at a higher resolution than other timer services.
其中包含以下几个函数:
timeBeginPeriod
timeEndPeriod
timeGetDevCaps
timeGetSystemTime
timeGetTime
timeKillEvent
TimeProc
timeSetEvent
具体没仔细研究过不知道怎么用.
LZ可以去啃啃MSDN,上面有例子.