1

WindowsアプリケーションとWPFアプリケーションの両方のタイマー制御のリンクをいくつか検索しましたが、状況についてアドバイスをいただければ幸いです...

私はWPFを使用しているので、最初のオプションは次のいずれかであるようですSystem.Windows.Threading.DispatcherTimerSystem.Diagnostics.Stopwatch

私が達成する必要があるのは、各WPFDocumentPanelが、通常100ミリ秒の最小間隔で外部APIからの更新を要求することです。これは、それぞれに固有の間隔でいつでも最大DocumentPanelです。たとえば、DP1は100ミリ秒、DP2は20,000ミリ秒などです。

通常、私のアプリは1つのDocumentPanelで始まり​​ますが、ユーザーは無制限にパネルを拡張できるため、CPUの能力とアプリの速度をユーザーが判断します。

基準は次のとおりです。

  1. 複数のDocumentPanel-通常は最低1〜20ですが、スケーラビリティに関するアドバイスは大歓迎です。

  2. 可変イベント間隔(Iv)(最小イベント間隔100ms-最大<1日)

  3. 精度-1ms(どのような状況でも(Iv)ms未満の間隔を持つことはできません。オーバーはそれほど問題ではありませんが、数ミリ秒以内である必要があります)編集:1msは厳密には要件ではありませんが、平均(Iv)は短い間維持する必要がありますタイムスケール。

  4. それぞれDocumentPanelがライブの日付/時刻を表示する必要がありますが、設定された間隔に基づいてイベントを生成します

WPFは私にとって混乱を招く問題であるため、現時点では実際のコードではなく、設計の検討を支援しています。

現在、私はの単一のインスタンスを使用することを目指してSystem.Diagnostics.Stopwatchおり、間隔時間に達しているかどうかに関係なく、各パネルがストップウォッチイベントに作用できるようにしています。

誰かアドバイスできますか?

ありがとうO

4

4 に答える 4

1

ティックとして100msの1つだけを使用してからSystem.Windows.Threading.DispatcherTimer、タグを使用して独自の間隔を決定することをお勧めします。たとえば、次のように使用できます。

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

通常、このような場合、タイマーが1つあり、各DocumentPanelの経過時間をチェックします。100%の精度は重要ではないと思います。999msを選択した場合、メインタイマーが50msごとに起動しても気付かないため、50msの増分しか与えられません。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の重要な違いは次のとおりです。

System.Timers.TimerがWPFアプリケーションで使用されている場合、System.Timers.Timerはユーザーインターフェイス(UI)スレッドとは異なるスレッドで実行されることに注意してください。ユーザーインターフェイス(UI)スレッド上のオブジェクトにアクセスするには、InvokeまたはBeginInvokeを使用してユーザーインターフェイス(UI)スレッドのディスパッチャーに操作を投稿する必要があります。System.Timers.TimerではなくDispatcherTimerを使用する理由は、DispatcherTimerがDispatcherと同じスレッドで実行され、DispatcherPriorityをDispatcherTimerに設定できるためです。

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を使用することはできないということです。この問題に特に適したもの

于 2012-08-31T00:24:48.927 に答える
0

Tagプロパティが必要な場合、およびより多くのカプセル化が必要な場合は、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 に答える