2009-09-15 2 views
0

내 문제 : 직렬 포트를 수신하고 모든 항목을 RichTextBox에 추가하는 SerialPort에 대한 DataReceived 이벤트가 있습니다. 이제 RichTextBox의 내용을 txt 파일에 저장하고 싶습니다. 그냥 내 두 가지 작업 (가변 콘텐츠, 명확한를 RichTextBox 저장) 사이에 또 ​​다른 입력하여 SerialPort에 올 수 있다고,RichTextBox에서 텍스트 삭제

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

그러나 나는 두려워 (그리고 만약 내가 잘못 나 수정하시기 바랍니다) : 나는이 작업을 수행 할 수 있습니다. 변수에 저장하지 않았고 RichTextBox를 지우지 않았기 때문에이 새로운 데이터가 삭제 될 수있었습니다.

이 일이 실제로 발생할 수 있으며 어떻게 피할 수 있습니까?

감사합니다.

답변

2

. DataReceived 이벤트에서 Invoke를 사용한다고 가정합니다. 따라서 RichTextBox의 내용을 변경하면 주 스레드에서 변경되므로 안전해야합니다.

하지만 직렬 포트의 스트림이 RTF 일 가능성은 거의 없으므로 (다른 문제가있는 경우) TextBox (MultLine = true)를 사용할 수도 있습니다.

+0

Invoke (DataReceived 스레드에서)로 RichTextBox에 쓰므로 쓰기 및 읽기가 동일한 스레드 (GUI)에 있습니다. 그 말은 내 시나리오가 생길 수 없다는 뜻인가요? – sventevit

+0

언뜻보기에 나는 Invoke를 사용하는 것이 당신을 보호 할 것이라고 생각하지 않았지만 이제는 이것을 생각했다. 이것이 당신을 보호 할 것이다. 좋은 대답입니다! +1 – David

+0

SQL의 직렬 포트에서 모든 입력을 확인하고 상태를 다시 가져 오기 때문에 RichTextBox를 사용합니다. 상태가 'OK'이면이 입력에 대한 텍스트 색상은 녹색이고, 그렇지 않으면 텍스트 색상은 빨간색입니다. 그래서 연산자가 쉽게 입력이 OK인지 아닌지 알 수 있습니다. – sventevit

0

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

이 문제를 방지하려면 뮤텍스를 사용할 수 있습니다. 이것이 작동하는 방식입니다. RichTextBox의 내용에서 작동하는 코드 스 니펫을 동시에 실행하면 안됩니다. 이 코드 스 니펫을 중요한 섹션이라고합니다. 임계 구역에 들어가면, 해당 구역을 종료 할 때 뮤텍스를 잠그고 놓습니다. 중요한 섹션을 입력하려고 할 때 뮤텍스가 잠겨 있으면 해당 뮤텍스가 해제 될 때까지 기다린 다음 작업을 수행하십시오.

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

C#에서 lock 문을 사용하여이 작업을 수행 할 수 있습니다.

추가 읽기 : Mutex, 당신은 어떻게 든 직렬 포트에서 입력을 동기화해야 Critical Section

+0

DIY 동기화가 작동하지 않으면 컨트롤에서 ThreadId를 확인하고 throw합니다. __have__ Invoke()를 사용하십시오. –

0

물론 이런 일이 발생할 수 있습니다.

다른 고려 사항이없는 한, RichTextBox.Text를 사용하여 파일에 쓰는 대신 SerialPort 스트림의 데이터를 사용하여 텍스트 파일을 직접 작성하는 것이 더 나을 것입니다. DataReceived 이벤트 처리기는 다음과 유사해야합니다.

+0

DataReceived 이벤트에서 먼저 텍스트를 SQL 데이터베이스에 쓴 다음 RichTextBox에 표시하여 운영자가 스캔 한 내용을 화면에서 볼 수 있도록합니다.텍스트 파일에 저장하는 것은 운영자에게 또 다른 옵션입니다 (문제가 해결되지 않으면 텍스트를 파일로 저장하여 관리자에게 보낼 수 있음). – sventevit

관련 문제