• window sleep函数


    转载( 自 夏至千秋

    一、问题产生

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

    二、调查结果总结

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

    window不同的操作系统平台sleep的时长是有区别的,win7 sleep(1)1ms,  win10 sleep(1) 14~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精度要高。我没有测试这个

  • 相关阅读:
    搜索优化
    ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)
    Tomcat7.0.22在Windows下详细配置过程
    maven 安装配置
    Venus wiki
    搜索引擎基本原理及实现技术——用户查询意图分析
    sql 表自连接
    select 多表查询
    select 嵌套
    Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)
  • 原文地址:https://www.cnblogs.com/8335IT/p/12370846.html
Copyright © 2020-2023  润新知