挂起能精确到1毫秒以下吗?

原帖地址 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,上面有例子.

     

     

     

     

     

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值