1

適切にフォーマットされた文字列を送信すると、次のようなデバイスがあります。糸を返します。この返された文字列を WPF ListView コントロールで使用したいのですが、シリアル ポートの反対側にあるデバイスを無限にクエリするのに問題があります。3秒程度ごとにデータを更新したいと思います。
アプリケーションロジックは次のとおりです。

            public static void queryDevice()
        {
            SerialPort _serialPort = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
            _serialPort.Handshake = Handshake.None;
            ObservableCollection<string> store= new ObservableCollection<string> { " ", " ", " " };
            string[] query = new string[3] { "t02", "t03", "t04" };
            while (true)
            {
                for (int i = 0; i < 3; i++)
                {
                    string add = SerialCom.returnData(query[i], _serialPort);//returns data depending on which query was sent
                    if (store[i] != add)
                    {
                        store.Add(add);
                    }
                }
                Thread.wait(300);

            }
        }

このコードを UI スレッドに配置すると UI スレッドがロックされるため、このコードをスレッド化する最良の方法を見つけようとしています。そのメモの ListView のデータソースとして ObservableCollection を使用する予定です。

ありがとう!

4

2 に答える 2

2

私の意見では、これらのコードを 2 つの方法に分け、スレッドを使用する必要があります。

多分このように

    public static void queryDevice()
    {
        SerialPort _serialPort = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
        _serialPort.Handshake = Handshake.None;
        ObservableCollection<string> store= new ObservableCollection<string> { " ", " ", " " };
        string[] query = new string[3] { "t02", "t03", "t04" };
        Thread thread = new Thread(delegate(){Process(store,query,_serialPort);});
        thread.Start();
    }



     public static void Process(ObservableCollection<string> store, string[] query, SerialPort _serialPort)
     {
         while (true)
         {
             for (int i = 0; i < 3; i++)
             {
                 string add = SerialCom.returnData(query[i], _serialPort);
                 if (store[i] != add)
                 {
                     store.Add(add);
                 }
             }
             Thread.Sleep(300);
         }
     }
于 2012-10-30T04:16:50.180 に答える
0

これは、この特定のケースでは実際に必要な量を超えていますが、私は通常、そのようなものにプロデューサー/コンシューマー パターンを使用します。自分が何をしているかを知っているという理由だけで、スレッド化は間違いが入り込みやすく、発見するのが難しいものの 1 つです。

C# の実装については、Implementing the Producer/Consumer Pattern in C# をご覧ください。

勉強中に学んだすべてのことの中で、これが最も役立つことが証明されています;D

ヒント: Producer と Consumer は独自のスレッドを取得し、 Consumer がObservableCollection.

免責事項:より効率的で無駄のないソリューションがあるため、それが要件である場合は別のソリューションを使用してください。ただし、おそらくWPFを使用していなかったでしょう;D

于 2012-10-30T00:17:45.983 に答える