<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Bug Captor の 開發日記帳-Programming</title>
<link>http://blog.roodo.com/toki_kanno/archives/cat_661475.html</link>
<description>一些開發程式時的碎碎唸，先找個地方記起來免的忘記</description>
<language>zh-tw</language>
<generator>Roodo Blog System</generator>
<copyright>All Rights Reserved</copyright>
<atom:link href="http://blog.roodo.com/toki_kanno/archives/cat_661475.xml" rel="self" type="application/rss+xml" />
<item>
	<title>高精度Timer</title>
	<description><![CDATA[
			在撰寫多媒體相關的程式的時候，常常會需要一些高精確度的計時器來做時機掌握。一般來說，WM_TIMER是絕對出局的，這個計時器一來精度不高，二來送來的Windows Message還有可能被忽略。接來下則是MultiMedia Timer，這個計時器可以很準確的計時到1ms左右的時間而且又有方便的callback或是event notify可以在時間到時通知使用者。使用上算是很方便的。最精確計時方式則要屬QueryPerformanceCounter了，但是要用它來記時，必需要維持一個busy loop不斷的Query這個counter。如此一來在單CPU的機器上可能會造成CPU資源被吃的一乾二淨。也因此比較好的做法是:1、使用一個while loop，在內部使用1ms的MultiMedia Timer定時計時。同時query一次PerformanceCounter並將觸發時間減去這次測得的performance tick。2、當要觸發的時間剩不到1ms時，開始進入QueryPerformanceCounter的busy loop，於觸發時間歸零時，向外觸發event或是delegate。另外有一個小撇步，當只需要一次性短程的計時器時，可以用Thread.Sleep()來達成，但是在使用前可以呼叫timeBeginPeriod(1)來將全系統的計時器精度調整至1ms。但是由於這會影響到全系統的timer精度(當然越小對於系統的負擔越大)，所以在使用完畢後記得呼叫timeEndPeriod()來還原系統timer的精度。
		]]>
	</description>
	<content:encoded><![CDATA[
			在撰寫多媒體相關的程式的時候，常常會需要一些高精確度的計時器來做時機掌握。<div><br /></div><div>一般來說，WM_TIMER是絕對出局的，這個計時器一來精度不高，二來送來的Windows Message還有可能被忽略。</div><div><br /></div><div>接來下則是MultiMedia Timer，這個計時器可以很準確的計時到1ms左右的時間</div><div>而且又有方便的callback或是event notify可以在時間到時通知使用者。使用上算是很方便的。</div><div><br /></div><div>最精確計時方式則要屬QueryPerformanceCounter了，但是要用它來記時，必需要維持一個busy loop不斷的Query這個counter。如此一來在單CPU的機器上可能會造成CPU資源被吃的一乾二淨。也因此比較好的做法是:</div><div><br /></div><div>1、使用一個while loop，在內部使用1ms的MultiMedia Timer定時計時。同時query一次PerformanceCounter並將觸發時間減去這次測得的performance tick。</div><div>2、當要觸發的時間剩不到1ms時，開始進入QueryPerformanceCounter的busy loop，於觸發時間歸零時，向外觸發event或是delegate。</div><div><br /></div><div>另外有一個小撇步，當只需要一次性短程的計時器時，可以用Thread.Sleep()來達成，但是在使用前可以呼叫timeBeginPeriod(1)來將全系統的計時器精度調整至1ms。但是由於這會影響到全系統的timer精度(當然越小對於系統的負擔越大)，所以在使用完畢後記得呼叫timeEndPeriod()來還原系統timer的精度。</div>
		
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/toki_kanno/archives/9025195.html</link>
	<guid>http://blog.roodo.com/toki_kanno/archives/9025195.html</guid>
	<category>Programming</category>
	<pubDate>Tue, 19 May 2009 13:44:22 +0800</pubDate>
</item>
</channel>
</rss>