簡體   English   中英

與System.Windows.Forms.Timer的時間間隔不一致

[英]Inconsistent intervals with System.Windows.Forms.Timer

請客氣,我正在學習C#,並且從前雇員那里繼承這個應用程序是我的第一個C#項目。

我正在觀察與System.Windows.Forms.Timer不一致且緩慢的時間段。 該應用程序是使用MS Visual Studio C#編寫的。

計時器設置為100毫秒的時間間隔,但我正在觀察范圍從110毫秒到180毫秒的時間段。

我正在使用幾種工具來觀察這種情況,包括:-SW示波器(Iocomp.Instrumentation.Plotting.Plot程序包),-真正的示波器,-讓計時器運行一段時間並比較滴答數* 100毫秒系統時間和秒表。

在所有情況下,我都觀察到在最初的幾秒鍾內出現了10%的延遲。

每個刻度執行的方法運行時間少於4毫秒。 也沒有費時的異步處理發生。 不過,這並不重要,因為計時器滴答是一個中斷,而不是添加到事件處理程序隊列中的事件(據我所知)。

有人遇到過這樣的問題嗎? 根本原因是什么?

謝謝。

計時器僅與操作系統時鍾中斷一樣准確。 默認情況下,每秒滴答64次,即15.625毫秒。 您無法從中獲得100毫秒的整潔間隔,也無法被15.625整除。 您將獲得下一個整數倍,即7 x 15.625 = 109.375毫秒。 非常接近您觀察到的110毫秒。

您需要將計時器通知處理中的延遲添加到此理論最小值。 計時器必須與UI線程中發生的所有其他事情競爭。 它們被視為要傳遞的不重要的通知。 已發送的消息排在第一位,用戶輸入位於第二位,繪畫位於第二位,計時器消息位於最后。 無論哪種方式,如果您有一個復雜的用戶界面都需要一段時間才能重新繪制,則Tick事件將被延遲,直到完成。 對於您編寫的任何處理不重要的事件處理程序都相同,例如讀取文件或查詢dbase。

為了獲得一個不受這種延遲影響的更響應的計時器,您需要使用一個異步計時器。 System.Threading.Timer或System.Timers.Timer。 避免后者。 他們的回調在線程池線程上運行,因此可以快速運行。 要非常小心在此回調中執行的操作,因為它們不是線程安全的,所以您無法執行許多操作。

您可以通過更改時鍾中斷率來使這些計時器更准確。 這需要調用,調用timeBeginPeriod()。 完成時使用timeEndPeriod()。

是的,我始終會遇到System.Windows.Forms.Timer此問題,因為它(大部分時間)不能准確計時。 您可以嘗試使用System.Timers.Timer ,它會精確地引發中斷(至少100ms精度)

System.Windows.Forms.Timer實際上只是本機WM_TIMER消息的包裝。 這意味着計時器消息在大約與您請求的時間間隔(正負...此處不保證)之間的時間被放入消息隊列中。 該消息被處理完全依賴於隊列中的其它消息,並且每個需要處理多長時間。 例如,如果您阻止UI線程(從而阻止隊列處理新消息),則在取消阻止之前,您將不會獲得計時器事件。

Windows不是實時操作系統,您不能期望計時器具有精確的精度。 如果您想要更細粒度的內容,則多媒體計時器是最佳選擇。

這很古老,但萬一有人來這里尋找正確的答案:

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.timer(v = vs.110) .aspx (重點是我):

Windows Forms Timer組件是單線程的,並且精度限制為55毫秒 如果需要更高精度的多線程計時器,請使用System.Timers命名空間中的Timer類。

因此,使用Windows.Forms.Timer可以獲得55ms,110ms,165ms等。 這與您所看到的一致。 如果需要更高的精度,請嘗試使用System.Timers.TimerSystem.Threading.Timer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM