当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毫秒
::Sleep(); //当前线程挂起一毫秒
timeEndPeriod(); //结束精度设置
这样可以将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());
据说经过测试发现运行10万条数据进行测试发现nanoseconds精度只能达到1.03ms左右(注意依旧达不到微妙级、纳秒级) 但是比使用timeBeginPeriod精度要高。我没有测试这个
当Thread.Sleep的暂停时间参数设置过小时,精度很差的解决方法的更多相关文章
- win10提示“无法设置移动热点 请打开WLAN”的解决方法
一位用户在使用Win10创意者操作系统过程中,遇到了无法开启移动热点的情况,开关呈灰色状态,而且提示:无法设置移动热点 请打开WLAN,该如何解决呢?该用户表示Wlan一直开着呀,感觉非常奇怪.接下来 ...
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space(Java堆空间内存溢出)解决方法
http://hi.baidu.com/619195553dream/blog/item/be9f12adc1b5a3e71f17a2e9.html问题描述Exception in thread &q ...
- 优化MySQL开启skip-name-resolve参数时显示“ignored in --skip-name-resolve mode.”Warning解决方法
转自:http://blog.csdn.net/yiluoak_47/article/details/53381282 参数用途: skip-name-resolve #禁止MySQL对外部连接进行D ...
- 转 VS2010 RDLC 横向合并时“未正确设置 tablix“Tablix1”的 FixedData 属性”错误解决方法 .
最近在使用Rdlc做报表打印,有些报表的表头需要合并表头.Rdlc本身提供了横向合并的工具,但是在实际合并的时候,会出现“未正确设置 tablix“Tablix1”的 FixedData 属性.除非在 ...
- 给子元素设置margin-top无效果的一种解决方法
在写一个登陆界面的时候,设置登录按钮的margin-top时出了问题 先是这么写的 <div style="margin-top:30px"> <a style= ...
- js中setTimeout()时间参数设置为0的探讨
起因源于一道前端笔试题: var fuc = [1,2,3]; for(var i in fuc){ setTimeout(function(){console.log(fuc[i])},0); co ...
- HTTP请求时间参数设置
1. JSON 2019-01-18 18:36:35 2. Postman 2019/01/18 18:36:35
- EnyimMemcached中用DateTime参数设置过期后赋值有问题的解决.
环境: win10 64位.memcached 1.4.4 64位.EnyimMemcached 2.16.0(ps:2.13.0也有此问题,别的版本就没试了). EnyimMemcached git ...
- [前端_EasyUI]给easyui的datebox设置默认值,获取不到 的解决方法
//给eayui datebox设置初始值 $("#ctime").datebox("setValue", function(){ var date = new ...
随机推荐
- 安卓开发笔记——关于照片墙的实现(完美缓存策略LruCache+DiskLruCache)
这几天一直研究在安卓开发中图片应该如何处理,在网上翻了好多资料,这里做点小总结,如果朋友们有更好的解决方案,可以留言一起交流下. 内存缓存技术 在我们开发程序中要在界面上加载一张图片是件非常容易的事情 ...
- 协作图 Collaboration diagram
概述 协作图也是一种交互图,但一般用的比较少,一般用在大概分析一下对象之间是怎样交互的,跟顺序图是可以相互转化的. 协作图的用处: 在分析的时候(而顺序图一般设计的时候),分析出有哪些对象: 在白板上 ...
- TL(简单)
TL time limit per test 2 seconds memory limit per test 256 megabytes input standard input output sta ...
- C# 通过WebService方式 IIS发布网站 上传文件到服务器
应用场景:要将本地的文件 上传到服务器的虚拟机上 网络环境:公司局域网(如下图中第二种) 开发环境:VS2010 服务器环境:WinServer2008 虚拟机环境:WinServer2008 ...
- oracle/sqlserver 递归
1.Oracle递归查询 2.SqlServer递归查询 with cte as ( select t.id,t.name,t.parentId from dbo.Department t where ...
- [引用]SQLServer占CPU100%
程序猿是如何解决SQLServer占CPU100%的 文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警事件 SQL2:获取当前的总报警记录数 ...
- Entity Framework访问MySQL数据库的存储过程并获取返回值
一.创建MySql存储过程 1, CREATE PROCEDURE `InsertAlarmInfo`(in businessindex int, in providerindex int, in ...
- [Ubuntu] bash: warning: setlocale: LC_ALL: cannot change locale
问题症状 -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.utf8) 解决方法 本地化是指不同地区用户在键盘上输入不同语言 ...
- Hibernate基础映射
在说Hibernate映射前,我们先来了解下对象关系映射 ORM.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现.这样开发人员就可以把对数据库的操作转化为对这些对象的操作.我们 ...
- Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制
今天分享一些基础控制的脚本 1.位置(Position): 控制位置很简单,首先要知道要在xyz哪几个轴上移动,确定好后定义代表着那些轴的移动变量,速度(m_speed在函数外定义为全局变量)然后通过 ...