2011-08-04 3 views
1

텍스트 상자의 텍스트를 강조 표시하는 구문을 실행하는 가장 좋은 방법은 무엇입니까 (= 왼쪽은 빨간색, = 오른쪽은 파란색). CommandTask 스레드에서 데이터를 다시 검색하고 FinishCommand (UI 스레드에서)에서 강조 표시를 수행 했으므로 작동하지 않는 것처럼 보였습니다.하지만 UI를 약간 교착 상태로 만들었습니다.RichTextBox 구문 주요 스레드 모범 사례 강조 표시?

그렇다면 특수 문자가있는 RichTextBox Invoke 함수 (따라서 스레드 안전)에 강조 표시 코드를 배치하고 스레드에서 함수 호출을 이동했습니다. 그것도 효과가 있었지만, 어떤 이유로 든 4-8 초 정도 느려졌다. 이 코드는 정확한 코드이므로 나에게 의미가 없습니다.

마지막으로 스레드에서 temp RichTextBox를 만들고 결과 텍스트를 붙여 강조 표시했습니다. 그런 다음 모든 Invoke 함수가 실제 RichTextBox로 RTF를 전달했지만이 경우 RTF가 적절하지 않은 경우이 경우 해당 색상이 매번 2 씩 이동합니다. 예 : R = 빨강, B = 파랑 , X = 블랙 문자

라인 1. RRRRXBBBB (올바른)

라인 2 XXRRRRBBB 등

라인 3. XXXXRRRRX가 (우측으로 4 시프트 (착색 오른쪽으로 2 시프트) 및)

내 가장 중요한 질문은 어떤 접근 방식이 가장 좋고, 왜 똑같은 코드를 더 느리게 처리하며, 접근 방식 3이 가장 좋은지, 그 위어 색상 이동. 감사!

답변

3

호출이 비싸기 때문에 속도가 느립니다. 두 개의 스레드 컨텍스트 전환이 필요하며 UI 스레드는 유휴 상태 여야합니다. 모든 강조 표시 변경에 대해이 작업을 수행하면 심각하게 스레드가 중단됩니다. BeginInvoke()를 사용하면 문제를 해결할 수 있지만 이제는 UI 스레드가 응답하지 않게됩니다. 즉, 당신은 그 전략으로 이길 수 없습니다.

도우미 RTB에 어떤 문제가 있는지 잘 모르겠습니다. 각 줄마다 두 개씩 떨어져 있으며 간단한 버그 같은 냄새가 난다. 줄 끝에서 캐리지 리턴 + 줄 바꿈을 고려하지 않는 것.

속도를 향상시키는 가장 좋은 방법은 텍스트를 강조 표시 할 때 RTB가 자동으로 업데이트되지 않도록하는 것입니다. 아주 큰 차이. 그건 내장되어 있지 않지만 당신은 easily add it 일 수 있습니다. 그리고 손실을 줄이는 것을 고려해보십시오, RTB는 아주 좋은 편집인이 아닙니다. ScintillaNET을보십시오.

+0

글쎄, 제 3의 경우는 어떻습니까? 스레드는 RTF 문자열을 반환하고 RichTextBox에 씁니다. RichTextBox는 UI 스레드에서 onFinish가 발생하기 때문에 Invoke가 필요 없습니다. 이 경우에도 여전히 약 3-6 초 느리다. (또한 나는 그 변하는 버그를 고쳤다./r/n은 1 char로 간주되지만 2 바이트이기 때문에 rtf 문자열을 버리고 그냥 모든 것을 대체했다./r/n과/r/r 그리고 그것의 벌금) – Hershizer33

+0

나는 몰라, 내가 볼 수없는 코드를 추측하도록 요구하고있다. RTF를 재분석해야하기 때문에 RTF의 큰 덩어리를 펌프로 보내면 RTB가 느려질 수 있습니다. –

+0

좋은 지적, 병은 함께 관련 코드를 붙여서 붙여 넣습니다. – Hershizer33

0

일반적인 접근 방식은 (모두 StringBuilder, StringWriter를, 등) 빠른 문자열 조작을 사용하여 RTF 호환 문자열을 구축 RTF 발생기의 일종을 구현하고 자신과 RichTextBox 컨트롤의 RTF 코드를 대체하는 것입니다 :

string rtf = /* Generate RTF code based on original text */ 
richTextBox.Rtf = rtf; // Replace text box's RTF code 

:

http://msdn.microsoft.com/en-us/library/aa140277%28v=office.10%29.aspx

당신은 기본적으로 생성해야합니다 :

는 여기에서 RTF 형식에 대한 설명서를 찾을 수 있습니다

  • RTF 헤더
  • 글꼴 표
  • 색상 표
  • 문자 텍스트

워드 패드를 사용하여 시행 착오를 통해이 작업을 수행 할 수 있습니다, 당신을 강조 구문으로 간단한 문서를 작성 RTF 형식으로 문서를 저장 한 다음 메모장이나 유사한 응용 프로그램에서 열어서 생성 된 RTF를 분석하십시오.

이 방법의 이점은 별도의 스레드에서 RTF 코드를 생성 한 다음 코드 생성시 사용자 인터페이스를 한 번만 업데이트 할 수 있다는 것입니다.