2012-08-31 74 views
1

我搜索了定時器控制Windows和WPF應用程序的幾個環節,但我會在我的情況得到一些意見...WPF多個定時器控制

由於我使用WPF似乎初始選項要麼System.Windows.Threading.DispatcherTimerSystem.Diagnostics.Stopwatch

我需要的,以實現對於每個WPF DocumentPanel在通常100ms的閔之間定義的時間間隔從外部API請求更新 - 與間隔唯一的每個DocumentPanel隨時最大例如DP1可以是100ms,DP2可以是20000ms等等。

通常我的應用程序會從1個DocumentPanel開始,但用戶可以無限制地擴展面板,因此用戶可以判斷CPU能力和應用程序的速度。

的標準包括:

  1. 多DocumentPanels - 通常1 - 20最低,但在可擴展性的任何建議是值得歡迎的。

  2. 可變事件間隔(IV)(最小事件間隔100毫秒 - 最大<1天)

  3. 精度 - 1毫秒(不能低於(四)在任何情況下毫秒的間隔,在是沒有那麼多的關注,但需要在幾毫秒內)編輯:1ms不是嚴格的要求,但平均(IV)必須在短時間內維持。

  4. 每個DocumentPanel必須顯示實時日期/時間,但根據設置的時間間隔產生事件

我真的有設計考慮,而不是目前的WPF實際代碼的幫助後是混亂的事項我。

目前,我趨向於使用System.Diagnostics.Stopwatch的單個實例,並允許每個面板在秒錶事件上行動是否已達到間隔時間。

任何人都可以建議嗎?

謝謝 Ø

+2

1ms的[R解決方案 - 祝你好運。它認爲獲得這個的唯一方法是使用計時器來關閉,然後忙 - 等到秒錶(高分辨率性能計數器)點擊。 –

+0

如果我可以找到一種方法來確保(Iv)ms間隔永遠不會小於(Iv),那麼它可能不需要具有1ms的精度 - 這可能嗎? – user3357963

+0

@lc。真正。 Windows可以在1毫秒內完成。 – kenny

回答

1

其更好地只使用一個System.Windows.Threading.DispatcherTimer 100毫秒蜱,然後用標籤來確定自己的時間間隔,比如你可以在創建使用

struct IntervalComparer 
{ 
    int myinterval; //the individual update interval (300ms for example) 
    int currentinterval; 
    public IntervalComparer(int myinterval) 
    { 
      this.myinterval=myinterval; 
      this.currentinterval=0; 
    } 

     public void TickMe() 
     { 
      currentinterval++; 
     } 

     public void ResetkMe() 
     { 
      currentinterval = 0; 
     } 

     public bool CanIUpdate() 
     { 
      return myinterval == currentinterval; 
     } 
} 

.... Form_Loaded.... 
{ 
..... 
     mypanel=new Panel(); 
     mypanel.Tag= new IntervalComparer(2); // 2 * 100ms 
..... 
} 

.... Timer_Tick.... 
{ 
    .... 
    (mypanel.Tag as IntervalComparer).TickMe(); 
    if((mypanel.Tag as IntervalComparer).CanIUpdate()) 
    { 
     UpdateMyPanel();//your update method 
     (mypanel.Tag as IntervalComparer).ResetMe(); 
    } 

    .... 
} 
+0

我會建議,而不是使用100ms的倍數,你仍然可以使用實際需要的ms。如果是95ms,那麼它大部分時間會舍入到100ms,但是下降到足以使*平均值*以95ms爲間隔觸發。假定它每小時發生的次數很重要。 – MikeKulls

+0

是的,你也可以在不同的線程上打勾你的計時器,然後調用main_UI_Thread上的UpdateMyPanel – S3ddi9

1

通常在這樣的情況下,我會有一個計時器,然後檢查每個Docum的運行時間entPanel。我猜100%的準確度並不重要,如果他們選擇999ms,那麼他們不會注意到,如果你的主計時器每隔50ms觸發一次,所以只能給他們50ms的增量。無論如何,Windows並沒有提供這樣的準確性,我在試圖觸發閃光燈時學到了這一點。

1

我用下面的方法來實現在Silverlight應用程序類似:

單定時器以一個小間隔蜱(你是自由裁量權,但將需要比最低支持的更新間隔下),然後讓每個DocumentPanel訂閱此計時器的tick事件。

當tick事件觸發時,每個DocumentPanel會根據更新頻率(E.G.(last update now)> interval)確定是否需要更新。

有一些定時器類的在這裏進行比較:

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

DispatcherTimer沒有被提及,但DispatcherTimer和System.Timers.Timer之間的重要區別是:

如果System.Timers.Timer用於WPF應用程序中,值得注意的是System.Timers.Timer在不同的線程上運行,然後在用戶界面(UI)線程上運行 。爲了訪問用戶界面(UI)線程上的對象,有必要使用Invoke或 BeginInvoke將操作發佈到用戶界面(UI)線程的 分派器上。使用DispatcherTimer與System.Timers.Timer相反的原因是DispatcherTimer與Dispatcher在同一個線程上運行,並且DispatcherPriority可以在DispatcherTimer上設置爲 DispatcherTimer。

(來自http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx)。

不知道你當前如何處理UI更新以及你的程序是如何構建的,很難說你應該使用哪個計時器。

我不是巨大熟悉使用秒錶,但我的觀點是(閱讀http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx之後),使用單人秒錶不是那種特別適合於這個問題

0

使用可以從DocumentPanel繼承如果你需要Tag財產&更多的封裝

class UpdatableDocumentPanel : DocumentPanel 
    { 
     public int myinterval { get; set; }//the individual update interval (300ms for example) 
     int currentinterval; 


     public void Update() 
     { 

      currentinterval++; 

      if (myinterval == currentinterval) 
      { 
       currentinterval = 0; 
       UpdateMyPanelMethod(); 
      } 
     } 
    } 

.... Form_Loaded.... 
{ 
    ..... 
    mypanel.myinterval = 2; // 2 * 100ms 
    ..... 
} 

.... Timer_Tick.... 
{ 
    .... 
    mypanel.Update(); // simply 
    .... 
}