C# 串口和复选框更新

C# 串口和复选框更新,c#,checkbox,serial-port,C#,Checkbox,Serial Port,在我的应用程序中,我从串行端口接收数据并将其保存到两个布尔数组中。 我将根据这些数组设置复选框。但复选框不会仅在我更改选项卡时更新。… 以下是我的做法(也许有更好的方法) 假设您准备启动一个线程来检查串行端口,然后让您的GUI近实时地更新到串行线程中遇到的更改,那么您可能需要做几件事 当复选框更改状态时,我会从串行读取代码引发一个事件 GUI可以订阅此事件,但是必须注意跨线程。也就是说,不能让事件处理程序直接更新由单独线程拥有的GUI元素 因此,在事件处理程序中,您需要通过所属线程调用更新 我

在我的应用程序中,我从串行端口接收数据并将其保存到两个布尔数组中。
我将根据这些数组设置复选框。但复选框不会仅在我更改选项卡时更新。…

以下是我的做法(也许有更好的方法)


假设您准备启动一个线程来检查串行端口,然后让您的GUI近实时地更新到串行线程中遇到的更改,那么您可能需要做几件事

  • 当复选框更改状态时,我会从串行读取代码引发一个事件
  • GUI可以订阅此事件,但是必须注意跨线程。也就是说,不能让事件处理程序直接更新由单独线程拥有的GUI元素
  • 因此,在事件处理程序中,您需要通过所属线程调用更新 我写了一篇关于Winform应用程序处理跨线程的习惯用法的文章


    我也不确定输入数组是如何定义的,但一般来说,两个线程在没有某种控制机制的情况下访问共享数据不是一个好主意。如果您的数组是基于原子读写的数据类型,那么它可能是正常的,但通常您要考虑当一个线程处于非原子写的中间时,当另一个线程读取或写入相同的数据时会发生什么。关于线程安全,您可能想熟悉的内容很多。

    添加一个注意事项:复选框不会刷新,因为您正在创建一个新线程,当您尝试更改复选框时,它从串行端口读取的对象仍然具有相同的值。
    private void comboBoxCommunication_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (serialPort.IsOpen)
      {
        recieveThread.Abort();
            serialPort.Close();               
      }
      ComboBoxItem cbi = (ComboBoxItem)comboBoxCommunication.SelectedItem;
      portCommunication = cbi.Content.ToString();
      serialPort.PortName = portCommunication;
      try
      {
        serialPort.Open();
        recieveThread = new Thread(dataRecieving);
            prijmiThread.Start();                                
        checkBoxI1.IsChecked = vstupy[0] ? true : false;
        checkBoxI2.IsChecked = inputs[1] ? true : false;
        checkBoxI3.IsChecked = inputs[2] ? true : false;
        checkBoxQ2.IsChecked = outputs[3] ? true : false;                                           
      }
      catch (IOException ex)
      {
            MessageBox.Show(ex.ToString(), "Error!", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
        }
    }
    
    private void dataRecieving()
    { 
        if (serialPort.IsOpen)
      {                    
        int i = serialPort.ReadChar();
        if (i == 'A')
        {
            inputs[0] = true;
        }
            else if (i == 'a')
            {
            inputs[0] = false;
        }
        if (i == 'B')
        {
            inputs[1] = true;
        }
        else if (i == 'b')
        {
            inputs[1] = false;
        }
        if (i == 'C')
        {
            inputs[2] = true;
        }
        else if (i == 'c')
        {
            inputs[2] = false;
        }
        if (i == 'D')
        {
            outputs[0] = true;
        }
        else if (i == 'd')
        {
            outputs[0] = false;
        }                        
      }           
    }