C# 实现上位机5ms定时,精度波动在几十微秒。

在最近做的一个项目上,上位机需要定时的发送采集指令到硬件,采集的频率为5ms。采用了线程池多线程处理数据,但是使用定时器Timer空间和Thread.sleep(5)都没能实现。出现了在部分时间点上能够达到要求,部分点的间隔达到了15.6毫秒,远达不到技术要求。为了解决这一问题,查询了大量的资料。怀疑这个与windows系统的cpu时间分配方式和线程沉睡后的唤醒有关。简单的讲一下,windows采用的是抢占式的时间分配,系统会根据每个线程的优先等级和线程运行时间计算出下一个运行的线程。当线程t1被唤醒时,不会立即执行而是先等当前在执行的线程tc的时间片结束后再和所有的线程一起计算出cpu下一个时间片执行的线程。这应该就是导致为什么会出现部分时间点间隔为5毫秒,部分时间间隔远大于5毫秒。

解决这个问题,采用了Thread.sleep(0)这个方法,其意思是重新计算线程的优先等级。在代码中多处添加该语句使程序cpu能够经常访问时间对比语句。

代码如下,两种方法都可以实现

在方法二中做了改进,加入了一个沉睡三秒语句,其中用是避免时间比较大量的占用线程时间。

还有可以通过调用windows的API实现。

        方法一:
        [DllImport("winmm")]
        static extern uint timeGetTime();

        [DllImport("winmm")]
        static extern void timeBeginPeriod(int t);

        [DllImport("winmm")]
        static extern uint timeEndPeriod(int t);


        private void timer() 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值