日期:2014-05-18  浏览次数:20752 次

挂起能精确到1毫秒以下吗?
现在执行一个操作,要在0.X毫秒以后在执行另外一个操作,比如我现在输入一个A,然后要在0.X毫秒以后在输出一个B
这个0.X毫秒有办法精确到吗?thread.sleep(1)是不行的,这个误差有10-15MS左右!
我现在的临时办法是使用一个空循环:for (int i = 0; i < 60000; i++) { }。这样大概不到1毫秒的延迟,但是这样会吃光CPU,CPU直接彪到100%,所以是肯定不可取的!
那么还有什么好的办法吗?希望试过了确实可行的朋友指教一二!

------解决方案--------------------
简单的事:命令a
int a=0;

//定时器处理函数,一个周期处理一个命令,第一次执行A 表示输入一个A
// 然后返回 ,然后置相应的命令 a=1后返回,这样a=1就可以执行B的输出操作
OnTime()

if(a = 0)
{
A();
a=1;
Break;
}
if(a = 1)
B();
}

//注意:多媒体定时器有严格的限制

C# code

      /// <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);

------解决方案--------------------
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,上面有例子.