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精度要高。我沒有測試這個


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM