4

問題

私はデータパッケージの一定の流れを持っています。新しいパッケージが着信するたびに(100ミリ秒間隔)、イベントがポップアップします。このイベントでは、パッケージをクラスに送信してデータを処理し、視覚化します。残念ながら、現在のパッケージが処理される前に新しいパッケージが送信された場合、パッケージのプロセスが中止される可能性があります。

私が今持っているもの

別のプログラムのdllとして使用されるコードです。dllのコーディングを始めたとき、私はc#を初めて使用したので、あまり複雑にしたくありませんでした。すべてが機能していますが、CPUが非常にビジーである場合、(視覚化の部分で)いくつかの醜いフレームスキップに直面しました。

私にはいくつかのクラスがあり、そのうちの1つはすべてのパッケージを処理しています。このクラスには、約50の属性25の関数と1000行のコードがあります。計算に必要な関数は6つだけです。残りは、属性を正​​しく設定することです(ユーザーが設定を変更した場合)。

変更する必要があるもの

そこで、リストを使用してすべての受信データをバッファリングしたいと思います。リストは別のスレッドで処理する必要があります。したがって、リストへのデータの書き込みに100ミリ秒以上かかることはほとんどありません^^(それぞれが約40個の要素を持つ2つの配列は、何にも等しくないはずです)

私が考えていること

上記のクラスを2つの別々のクラスに分割します。1つはパッケージを処理し、もう1つは設定を処理します。したがって、ユーザーと「プログラム」入力を分割します。「パッケージ処理」クラスを使用してバッファリングされたデータを処理するスレッドを作成します。

私には何の手がかりもありません

設定クラスには、処理クラスに必要な重要な属性が含まれているため、処理クラスも設定クラスのバッファーを変更/入力する必要があるため、最善の方法がわかりません。ただし、これはメインスレッドによって呼び出されます。それとも、設定と処理のクラスを分割せず、そのままにしておく方がよいでしょうか。私はスレッド化にあまり精通しておらず、この無料の電子書籍のスレッド化の最初の章をC#で読んでいます。

4

1 に答える 1

2

キューを追加して、処理用のスレッドを実装するだけです。これはスキップに役立ち、ほとんど変更する必要はありません。設定を分割してコードをリファクタリングすることは、多くの作業のように思われますが、ほとんどメリットがなく、新しいバグが発生する可能性があります。

キューを追加するには;

  • ConcurrentQueueを作成します(これはスレッドセーフなlifoであり、必要なものです)

        var cq=new ConcurrentQueue<Packets>();
    
  • すべてのデータパケットをそのキューに追加します

         cq.Enqueue(newPacket);
    
  • ループしてキューを処理する別のスレッドを作成します

         if (cq.TryDequeue(out newPacket)) 
         { 
            // Visualize new packet
         }
    
于 2012-09-07T14:51:01.370 に答える