2011-11-11 4 views
1

RichTextBox에서 15.000 라인을 더받을 수 있으므로 각 라인에 값을 추가해야합니다. 프로그램을 잠글 수 없도록하는 가장 좋은 방법은 무엇입니까?C에서 큰 텍스트 처리 #

Thread th1 = new Thread(Process); 
th1.Start(); 

을하지만 여전히 고정 : 다음

public void Process() 
     { 

       string[] lines; 
       string line; 
       string foo = " baa"; 
       if (richTextBox1.InvokeRequired) 
       { 

        lines = (string[])Invoke((ReadLines)delegate 
        { 
         return /* read .Lines[] from richTextBox1 */ 
        }); 
        int max = lines.Length; 

        for (int i = 0; i < max; i++) 
        { 
         line = lines[i]; 
         if (..) 
         { 
          lines[i] += "foo"; 
         } 
        } 

        Invoke((Update)delegate 
        { 
         /* set new lines to RichTextBox1 */ 
        }); 

       } 
     } 

과 :

현재, 나는 스레드로 실행하는 루프 라인을 처리하고 있습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 미리 감사드립니다.

+1

짐승의 본질은 불행히도 - 서식있는 텍스트 상자 컨트롤은 많은 줄을 차지하지 않으므로 할당이 UI를 잠글 것입니다. "해결 방법"대신 "재 설계"라고 생각합니다 – BrokenGlass

+0

예. 추가하기 전에 미리 표현해야하지만, 결국에는 텍스트 보스가 만들어지지 않습니다. 상용/교정 편집자 구성 요소를 얻으십시오. – TomTom

답변

0

유감이지만 텍스트 상자를 사용하지 말고 부분 업데이트 및 많은 양의 텍스트 처리를 위해 설계된 편집기 구성 요소 (예 : SyntaxEdit)를 사용하는 것이 가장 좋습니다. UI는 처리 때문에 잠기지 않지만 대용량 텍스트에서는 텍스트 상자가 비효율적이며 텍스트 상자는 업데이트하는 동안 UI 스레드를 차단합니다. 다시 쓰지 않으면 작동하지 않습니다. 당신은 14.900 라인에 대한 사양보다 더 큰 말하고있다. 상자의 텍스트를 업데이트 할 때마다 실제로 다시 그리기 작업이 느리게 시작됩니다. 하나는 당신이 방해 할 수 없으므로 모든 스레드가 도움이되지 않습니다. UI가 업데이트주기가 끝날 때까지 응답하지 않기 때문입니다.

큰 텍스트를 처리 할 준비가되어있는 "실제 텍스트 편집기"를위한 다른 구성 요소가 있습니다.

+0

RichTextBox를 사용하는 다른 솔루션이 없습니까? 그것은 일부 텍스트를 강조 표시해야하기 때문입니다. –

+0

SyntaxEdit 확인 - 상업용, 비용, 프로 그래머 용 편집기 구성 요소 (강조 표시 등) 및 큰 파일을 처리 할 수있는 블러. – TomTom

1

보십시오 BackgroundWorker control.

+0

-1. 업데이트가 이미 별도의 스레드에서 발생했을 가능성이 매우 높으므로 문제를 처리하기가 쉽지 않습니다 (호출시 볼 수 있음). 배경 작업자는 텍스트 상자를 사용하는 극도의 긴 업데이트 시간을 처리하지 못합니다. 이 시간 동안 UI는 여전히 고정되어 있습니다. – TomTom

-1

진도 표시가있는 BackgroundWorker에서 실행하는 것이 가장 좋습니다 (RichTextBox를 사용해야하는 경우). AJAX 이미지를 회전시키는 사람조차도 충분할 수 있습니다.

+0

-1. 표시는 좋지만, 포스터가 특별히 요구 한 문제 (UI 잠금)를 처리하지 않습니다. – TomTom