2011-07-18 2 views
2

아래 코드는 스레드에 있습니다.델파이 : 스레드에서 문자열을 할당하는 동안 폼이 얼어 짐

Tf1 := TFileStream.Create(LogsPath,fmOpenRead or fmShareDenyNone); 
... 
str:=TStringList.Create; 
str.LoadFromStream(tf1); 
... 
SynEditLog.Lines.Assign(str); // I do this with Synchronize 

텍스트 문서에는 30,000 개의 문자열이 있습니다.

SynEdit에 문자열을 할당하는 동안 양식이 고정됩니다.

문자열로 문자열을로드하려면 40 초가 필요합니다. 할당 - 8 초를 사용하는 경우.

이 양식의 상태를 방지하려면 어떻게해야합니까?

감사합니다 !!!

+0

왜 문자열 목록에 먼저로드해야합니까? 왜 컨트롤에 직접로드하지 않습니까? 그리고 TMemo는 8 초 만에 30,000 라인을로드 할 수있을 것입니다. –

+0

몇 가지 작업을합니다. 그것은 중요하지 않습니다. 내가 확인했다. 직접 할 경우 - 같은 시간. – maxfax

답변

2

모든 작업이 Assign에 대한 호출에서 발생하기 때문에 Application.ProcessMessages이 여기에서 전혀 도움이되지 않을 것이라고 생각하지 않습니다.

SynEditLogBeginUpdate/EndUpdate 가지가 있습니까? 나는 그들을 사용하고 어떻게 가는지 볼 것입니다. 예를 들어 : 그에 대응

SynEditLog.BeginUpdate; 
try 
    SynEditLog.Lines.Assign(str); 
finally 
    SynEditLog.EndUpdate; 
end; 

당신은 라인 속성에 문자열 목록의 할당을 분해해야합니다

작동하지 않습니다. 이런 식으로 뭔가 :

var 
    LIndex: integer; 
begin 
    SynEditLog.BeginUpdate; 
    try 
    //added: set the capacity before adding all the strings. 
    SynEditLog.Lines.Capacity := str.Capacity; 
    for LIndex := 0 to str.Count - 1 do 
    begin 
     SynEditLog.Lines.Add(str[LIndex]); 
     if LIndex mod 100 = 0 then 
     Application.ProcessMessages; 
    end; 
    finally 
    SynEditLog.EndUpdate; 
    end; 
end; 

(참고 : 브라우저에 직접 입력 코드는 컴파일되지 않을 수 있음)이, 1000

도 5000처럼, 더 큰 무언가에 LIndex mod 100 = 0을 늘려보십시오 너무 느린 경우

N @

+0

BeginUpdate/EndUpdate가 있습니다. 하지만 도움이되지 않습니다. – maxfax

+0

루프를 사용할 수 없습니다. 이 방법을 사용하여 문자열을 추가하는 경우 약 1 분이 소요됩니다! 지정 - 8 초. – maxfax

+0

먼저 Lines 속성의 용량을 설정해보십시오. 내 예를 업데이트했습니다. – Nat

1

GUI 스레드를 사용하여 컨트롤에 30,000 줄을 추가하기 때문에 양식이 멈추는 경우가 많습니다. 자연히 시간이 걸립니다. 이 시간 동안 GUI는 스레드를 사용 중이므로 업데이트 할 수 없으므로 고정됩니다.

한 번에 몇 줄 (또는 단 하나)을 추가하고 각 추가 사이에 GUI (Application.ProcessMessages (감사합니다 gordy))를 업데이트하면됩니다.

+1

그리고 Application.ProcessMessages를 호출하여 GUI를 업데이트하십시오. – gordy

+0

도움이되지 않습니다! ProcessMessages를 SynEdit의 SpecialLineColors 이벤트에 넣었습니다. 여기서는 선을 그립니다. 더 정확하게 SynEdit은 프레임에 있습니다. – maxfax

+0

ProcessMessages 호출로이 문제를 해결할 수 없습니다. * ONE * 라인은 많은 시간을 할애 할 수 있습니다. 로드를 백그라운드 스레드에 넣어야합니다. –

관련 문제