Обновление последовательного порта и флажков - PullRequest
0 голосов
/ 28 марта 2012

в моем приложении 'Я получаю данные из последовательного порта и сохраняю их в два bool массива.
И в зависимости от этого массива я устанавливаю флажки.Но флажки не обновляются только когда я меняю вкладки ....

Вот как я это делаю (возможно, есть лучший способ сделать это)

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

1 Ответ

1 голос
/ 28 марта 2012

Предполагая, что вы пытаетесь запустить поток, который проверяет последовательный порт, а затем обновлять свой графический интерфейс в режиме, близком к реальному, к изменениям, которые встречаются в последовательном потоке, вам, вероятно, нужно сделать несколько вещей.

  1. Я бы вызвал событие из кода последовательного чтения, когда флажок изменяет состояние
  2. GUI может подписаться на это событие НО , о котором вы должны знатьперекрестная резьбаТо есть вы не можете позволить обработчику события напрямую обновлять элемент GUI, принадлежащий отдельному потоку.
  3. Таким образом, в вашем обработчике событий вам нужно вызвать обновление через собственный поток.

Я однажды написал запись в блоге , чтобы разобраться с многопоточностью в приложениях Winform.

Я также не уверен, как определяется ваш входной массив, но в целом не рекомендуется, чтобы два потока обращались к общим данным без какого-либо механизма управления.Если ваш массив основан на типе данных, который выполняет атомарное чтение / запись, это может быть нормально, но обычно вы хотите рассмотреть, что произойдет, если один поток находится в середине неатомарной записи, когда другой поток либо читает, либо записывает те же данные,Множество материалов изобилует безопасностью нитей, с которыми вы, вероятно, захотите ознакомиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...