문제

내 문제:직렬 포트를 수신하고 모든 것을 RichTextBox에 추가하는 SerialPort에 대한 DataReceived 이벤트가 있습니다.이제 RichTextBox의 내용을 txt 파일로 저장하고 싶습니다.나는 이것을 할 수 있습니다 :

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

하지만 두 가지 작업(컨텐츠를 변수에 저장, RichTextBox 지우기) 사이에 SerialPort에 다른 입력이 올 수 있다는 점이 두렵습니다(제가 틀렸다면 수정해 주시기 바랍니다).변수에 저장하지 않고 그 직후에 RichTextBox를 지우기 때문에 이 새 데이터가 존재한다는 사실조차 알지 못한 채 삭제될 수 있습니다.

이런 일이 실제로 일어날 수 있으며 어떻게 방지할 수 있습니까?

감사해요

도움이 되었습니까?

해결책

어떻게든 직렬 포트의 입력을 동기화해야 합니다.DataReceived 이벤트에서 Invoke를 사용한다고 가정합니다.따라서 RichTextBox의 내용에 대한 모든 변경 사항은 기본 스레드에 의해 수행되므로 안전해야 합니다.

그러나 직렬 포트의 스트림은 RTF가 아닐 가능성이 높으므로(만약 RTF라면 다른 문제가 있을 것입니다) TextBox(MultLine=true)를 사용할 수도 있습니다.

다른 팁

여러 스레드를 사용하는 경우 이런 일이 발생할 수 있습니다.단일 스레드 응용 프로그램에서는 이 문제가 발생하지 않습니다.

이를 방지하기 위해 뮤텍스를 사용할 수 있습니다.작동 방식은 다음과 같습니다.RichTextBox의 콘텐츠에 대해 작동하는 코드 조각은 동시에 실행되어서는 안 됩니다.이러한 코드 조각을 중요 섹션이라고 합니다.중요한 섹션에 들어가면 뮤텍스를 잠그고 중요한 섹션을 나갈 때 해제합니다.중요한 섹션에 들어가려고 할 때 뮤텍스가 잠겨 있으면 해당 뮤텍스가 해제될 때까지 기다린 다음 작업을 수행하십시오.

이렇게 하면 파일에 쓰는 동안 직렬 포트를 통해 입력이 들어오면 데이터를 수신하는 스레드는 파일 I/O가 완료될 때까지 기다린 다음 이를 RichTextBox에 추가합니다.

다음을 사용하여 이를 달성할 수 있습니다. 잠그다 C#의 진술.

추가 자료: 뮤텍스, 중요 섹션

물론 그런 일이 일어날 수도 있습니다(아마도 그럴 것입니다).

다른 고려 사항이 없는 한 RichTextBox.Text를 사용하여 파일에 쓰는 것보다 SerialPort 스트림의 데이터를 사용하여 텍스트 파일을 직접 쓰는 것이 더 나을 것이라고 생각합니다.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