1

我搜索了一些用于 Windows 和 WPF 应用程序的 Timer Control 链接,但我希望能对我的情况提供一些建议......

当我使用 WPF 时,似乎初始选项要么是System.Windows.Threading.DispatcherTimer要么System.Diagnostics.Stopwatch

我需要实现的是每个 WPFDocumentPanel以定义的时间间隔从外部 API 请求更新,通常为 100 毫秒最小值 - 任何时间最大值,每个时间间隔都是唯一的DocumentPanel。例如 DP1 可以是 100ms,DP2 可以是 20,000ms 等等。

通常我的应用程序会从 1 个 DocumentPanel 开始,但用户可以无限制地扩展面板,所以这是用户对 CPU 能力和应用程序速度的判断。

标准包括:

  1. 多个 DocumentPanels - 通常最少 1 - 20 个,但欢迎任何关于可扩展性的建议。

  2. 可变事件间隔 (Iv)(最小事件间隔 100 毫秒 - 最大 < 1 天)

  3. 准确度 - 1 毫秒(在任何情况下都不能低于 (Iv) 毫秒的间隔,超过不是那么重要,但需要在几毫秒内)编辑:1 毫秒不是严格要求,但平均值 (Iv) 必须在短时间内保持时间尺度。

  4. 每个都DocumentPanel必须显示实时日期/时间,但根据设置的间隔生成事件

我现在真的在寻求设计考虑的帮助,而不是实际的代码,因为 WPF 对我来说很困惑。

目前,我正在接近使用单个实例System.Diagnostics.Stopwatch并允许每个面板对秒表事件采取行动,无论是否已达到间隔时间。

任何人都可以建议吗?

谢谢你哦

4

4 回答 4

1

最好只使用一个System.Windows.Threading.DispatcherTimer100ms 作为刻度,然后使用标签来确定它自己的间隔,例如你可以使用

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();
     }

   ....
}
于 2012-08-31T00:23:54.567 回答
1

通常在这种情况下,我会有一个计时器,然后检查每个 DocumentPanel 的经过时间。我猜 100% 的准确性并不重要,如果他们选择 999 毫秒,那么他们不会注意到你的主计时器是否每 50 毫秒触发一次,所以只能给他们 50 毫秒的增量。无论如何,Windows 并没有提供那种准确性,我在尝试触发一次闪光灯时了解到这一点。

于 2012-08-31T00:24:03.917 回答
1

我使用以下方法在 Silverlight 应用程序中实现了类似的功能:

以小间隔滴答的单个计时器(您可以自行决定,但需要低于支持的最低更新间隔),然后让每个 DocumentPanel 订阅此计时器的滴答事件。

当触发滴答事件时,每个 DocumentPanel 将根据其更新频率(EG(上次更新 - 现在)> 间隔)确定是否需要更新。

这里有一些计时器类的比较:

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

没有提到 DispatcherTimer,但 DispatcherTimer 和 System.Timers.Timer 之间的重要区别是:

如果在 WPF 应用程序中使用 System.Timers.Timer,则值得注意的是 System.Timers.Timer 运行在与用户界面 (UI) 线程不同的线程上。为了访问用户界面 (UI) 线程上的对象,有必要使用 Invoke 或 BeginInvoke 将操作发布到用户界面 (UI) 线程的 Dispatcher。使用 DispatcherTimer 而不是 System.Timers.Timer 的原因是 DispatcherTimer 与 Dispatcher 在同一线程上运行,并且可以在 DispatcherTimer 上设置 DispatcherPriority。

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

在不知道您当前如何处理 UI 更新以及您的程序结构如何的情况下,很难说您应该使用哪个计时器。

我对使用 StopWatch 不是很熟悉,但我的观点是(在阅读http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx之后)使用单个 StopWatch 不是t 特别适合这个问题的东西

于 2012-08-31T00:24:48.927 回答
0

Tag如果您需要该属性并进行更多封装,则 use 可以从 DocumentPanel 继承

    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
    ....
 }
于 2012-08-31T13:42:25.117 回答