【问题标题】:Threading serial port query and using the result in a ListView control线程化串行端口查询并在 ListView 控件中使用结果
【发布时间】:2012-10-29 23:48:17
【问题描述】:

我有一个设备,如果我发送一个格式正确的字符串;我得到一个字符串。我想在 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 线程。我计划使用 ObservableCollection 作为该笔记上 ListView 的数据源。

谢谢!

【问题讨论】:

    标签: c# wpf multithreading


    【解决方案1】:

    在我看来,您应该将这些代码分成两种方法并使用线程。

    可能是这样的

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

    【讨论】:

    • 完美!那么如何在串行查询方法和 UI 线程之间同步“存储”集合呢?
    • 好吧,我首先想到的是..你创建事件处理程序来触发事件,并在 UI 中捕获该事件..
    【解决方案2】:

    虽然在这种特殊情况下这超出了您的实际需要,但我通常将生产者/消费者模式用于此类事情。仅仅因为我知道自己在做什么,线程是错误往往很容易潜入并且很难发现的事情之一。

    对于 C# 实现,请查看 Implementing the Producer/Consumer Pattern in C#

    在我学习时学到的所有东西中,事实证明这是最有用的;D

    提示:生产者和消费者有自己的线程,消费者填写ObservableCollection

    免责声明:有更高效/更精简的解决方案,所以如果这是一个要求去另一个解决方案,但是你可能没有使用 WPF,然后;D

    【讨论】:

    • 是的,我想坚持使用 WPF。这些数据也填充了我在商业上获得的一些 wpf 刻度盘和仪表控件(以及 OpenStreetMap 控件)。我太设计聋了,不能自己做!我正在考虑生产者/消费者模式,但是是的,从串行端口中获取几个字符串的工作量太大。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多