2014-04-21 76 views
1

我需要捕獲10幀每秒的實時相機15分鐘。我用dispatcherTimer類,但似乎不能準確工作。如何使它準確?我甚至不保存圖像,因爲它很費時間,我只是把它保存在內存中,但仍然無法正常工作。我應該使用另一個庫嗎?dispatcherTimer無法正常工作

counter01 = new DispatcherTimer(); 
counter01.Tick += new EventHandler(counter01_Tick); 
counter01.Interval = new TimeSpan(0, 0, 0,100); // every 100 milliseconds == 10 frames per seconds 

回答

2

MSDN states在於:

定時器,不能保證當的時間間隔發生準確地執行, 但它們都保證時間間隔發生之前不執行。

你可以檢查StopWatch,它可能會幫助你。

2

它和可以是一樣準確。這要求你的用戶界面線程能夠快速響應,迅速調度它獲得的任何消息。包括DispatcherTimer生成的「時間到了」通知,即生成Tick事件的通知。

看到DispatcherTimer觸發Tick事件處理程序遲到的常見掛鉤是您遇到了流水問題。換句話說,事件處理程序所需的時間量是定時器的Interval屬性值的更長的。這會以您期望的方式照顧自己,只要您嘗試做的不僅僅是機器可以處理的事情,那麼無論您正在嘗試做什麼,都會在稍後運行。

不缺乏視頻的流水問題,一幀可以包含大量數據。典型的hidef視頻流以每秒25幀的速度運行,每幀包含1920×1080像素。這是25 x 1920 x 1080 x 3 = 148兆字節/秒。由於解壓縮開銷很小,您甚至無法以該速率將數據寫入磁盤。大多數消費級磁盤驅動器的最高容量爲30兆字節/秒,可達到或者減少2倍。將幀速率降低到10 /秒還不足以解決這個問題,這仍然是60 MB /秒,您必須採取更激烈的措施像減少幀大小的措施。或者使用可以實時壓縮視頻的好視頻編碼器。

這是一個系統問題,而不是DispatcherTimer問題。使用探查器獲取更多洞察,它可以幫助您識別真正的瓶頸。

+0

非常感謝您的完整答案@Hans,其實我的幀大小是固定的(640 * 480),它是灰色的圖像,必須保存在二進制文件中,因此每個幀都是307200 KB。由於在放療過程中必須製作患者的呼吸運動模型,並且扣除每一幀會丟失許多重要信息,因此幀數不能減少。我現在應該怎麼做?你是什​​麼意思,我應該使用一個好的錄像機?有可能使用線程編程來解決這個問題嗎?使用更好的CPU和RAM是一個好主意?但它不再保證 – Ehsan

+1

那麼,這是一個更容易解決的問題。但是,除非你知道瓶頸在哪裏,否則不要做任何事情。你必須運行一個分析器,所以你知道。 –