Удалить текст из RichTextBox
-
07-07-2019 - |
Вопрос
Моя проблема:У меня есть событие 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);
}