Вопрос

Моя проблема:У меня есть событие DataReceived для SerialPort, которое прослушивает последовательный порт и добавляет все в RichTextBox.Теперь я хотел бы сохранить содержимое RichTextBox в текстовый файл.Я мог бы это сделать:

string text = RichTextBox.Text;
// save file
RichTextBox.Clear();

Но я боюсь (и, пожалуйста, поправьте меня, если я ошибаюсь), что как раз между моими двумя действиями (сохранить содержимое в переменную, очистить RichTextBox) в SerialPort может поступить другой ввод.Поскольку я не сохранил их в своей переменной и сразу после этого очищаю RichTextBox, эти новые данные могут быть удалены, даже если я не буду знать, что они когда-либо существовали.

Может ли это произойти на самом деле и как я могу этого избежать?

Спасибо

Это было полезно?

Решение

Вы должны каким-то образом синхронизировать свои входные данные с последовательным портом.Я предполагаю, что вы используете Invoke в событии DataReceived .Таким образом, любые изменения в содержимом RichTextBox выполняются основным потоком, и вы должны быть в безопасности.

Но поскольку поток из последовательного порта вряд ли будет RTF (у вас были бы другие проблемы, если бы это было так), вы могли бы также использовать текстовое поле (MultLine= true).

Другие советы

Это может произойти, если вы используете несколько потоков.В однопоточном приложении эта проблема не возникла бы.

Чтобы предотвратить это, вы можете использовать мьютекс.Вот как это работает:Фрагменты кода, которые работают с содержимым RichTextBox, не должны выполняться одновременно.Эти фрагменты кода называются критическими разделами.Когда вы входите в критическую секцию, вы блокируете мьютекс и освобождаете его при выходе из критической секции.Если мьютекс заблокирован при попытке входа в критический раздел, подождите, пока этот мьютекс не будет освобожден, а затем выполняйте свою работу.

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

Вы можете достичь этого, используя замок оператор на c #.

Дальнейшее чтение: Мьютекс, Критическая Секция

Безусловно, это может произойти (и, вероятно, произойдет).

Если нет других соображений, я считаю, что вам было бы лучше использовать данные из потока SerialPort для прямой записи текстового файла, а не для записи в файл с помощью RichTextBox.Text.Обработчик события DataReceived должен выглядеть примерно так...

private void SerialPort1.DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string DataText = // code to read the serialport data and convert 
   //it into a string, which you already have so I 
   //won't repeat it here.

   WriteToTextBox(DataText);
   WriteToFile(DataText);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top