zoukankan      html  css  js  c++  java
  • 当Thread.Sleep的暂停时间参数设置过小时,精度很差的解决方法

    一、问题产生

    在C#和C++中有这样一个函数:void Sleep(int Timeout),可以让线程暂停指定的毫秒数。 但是我在win8下调用这个函数实现按照固定频率发送udp数据包时,会有一个问题。当Timeout<15ms左右是时,无论怎么减小Timeout,一秒钟发送的数据包和Timeout=15的时候基本上差不多,除非Timeout=0。【/(ㄒoㄒ)/~~】于是,我就开始考虑是不是millisecondsTimeout有个最小精度。

    二、调查结果总结

    windows不是实时系统,15ms左右会轮询一次,检查线程执行。这带该就是造成那个millisecondsTimeout精度为15ms的原因吧。

    三、解决方法

    方法有两种

    ①.多媒体定时器

    timeBeginPeriod(1); //设置精度为1毫秒
    ::Sleep(1);         //当前线程挂起一毫秒
    timeEndPeriod(1);   //结束精度设置

    这样可以将Sleep精度提升到1ms多一点(注意仍然达不到1ms)。
    在C#下可以使用这个:《C#多媒体定时器使用方法》http://blog.csdn.net/jane_sl/article/details/8019935
    关于更多的多媒体定时器:http://www.cnblogs.com/liuhao2638/archive/2013/06/13/3134109.html
    只定制Sleep这个函数《如何用C#做高精度计时器》http://blog.csdn.net/cloudhsu/article/details/5773043

    ②.使用C++11新特性

    std::this_thread::sleep_for(std::chrono::nanoseconds(100));

    据说经过测试发现运行10万条数据进行测试发现nanoseconds精度只能达到1.03ms左右(注意依旧达不到微妙级、纳秒级) 但是比使用timeBeginPeriod精度要高。我没有测试这个

  • 相关阅读:
    $scope.$watch监听
    git 修改地址,及提交返回403错误原因
    wepy wx:getLocation 配置 permission
    vue-cli 3.x 导入jquety
    微信小程序、微信公众号、H5之间相互跳转
    微信小程序之滚动选择器
    软件开发过程中所需要的文档
    Git 常用命令详解
    小程序填坑--TypeError: this.setData is not a function
    使用tomcat时,不用给webapps文件放入文件,直接访问项目方法
  • 原文地址:https://www.cnblogs.com/chihirosan/p/5139034.html
Copyright © 2011-2022 走看看