2014-07-13 3 views
-1

TThread.ShowMessage를 사용하여 Tmemo에 문자열을 추가하는 데 문제가 있습니다.이 문자열을 표시 할 수 있습니다.이 응용 프로그램은 Tmemo에 문자열을 추가하는 것에 대해 오류를주지는 않지만 그럴 수는 없습니다. TMemo에 추가되었습니다. 내 코드는 다음과 같습니다.Delphi XE6에서 TThread를 사용하여 TMemo를 편집 할 수 없습니다.

procedure TThreadGet.Execute; 
var 
Filed:TStringList; 
begin 
Filed:=TStringList.Create; 
Filed.LoadFromFile(Username1+'.dat'); 
Messaged:=Touser+':'+Filed.Text; 
Form2.Memo1.Lines.Add(Messaged);//Doesn't give error.But Doesn't Add String. 
Showmessage(Messaged);//Shows String Right. 
end; 
Filed.Free; 
Terminate; 
end; 
+3

스레드 단위의 맨 위를보십시오. IDE의 삽입 된 경고는 앱 메인 화면을 제외한 모든 스레드에서 VCL 구성 요소에 액세스/업데이트 할 수 없다는 것을 알 수 있으며 대신 동기화를 사용합니다. – MartynA

+0

하지만 레이블 등의 스레드를 사용하여 구성 요소를 편집 할 수 있습니다. – Srs

+0

아니요, 이제 방금 행운이었습니다. 그것에 대해 내 말을 듣지 마십시오. 경고를 보지 못하거나 무시하고 문제가 생기는 사람들로부터 수십 가지 질문이 있습니다. 비록 당신이 이것을 알고있을지라도 당신은 여전히 ​​문제를 겪을 수 있습니다. http://tackoverflow.com/questions/17705197/thread-safe-in-delphi btw에는 대답의 링크가 꽤 있습니다. – MartynA

답변

3

기본 UI 스레드에서 모든 VCL 컴포넌트에 액세스해야합니다. 예를 들어 TThread.Synchronize 또는 TThread.Queue으로 정렬 할 수 있습니다.

주된 이유는 Win32 창에 스레드 선호도가 있기 때문입니다. 또한 생성 된 스레드에서만 액세스 할 수 있습니다. 이 속성은 단일 스레드 UI에 매우 강력한 푸시를 제공하며 VCL 디자인은 이러한 방식으로 진행됩니다.

Win32에서 올바르게 작동하는 것이 훨씬 까다로울 수도 있지만 다중 스레드 UI가 가능합니다. VCL은 전혀 지원하지 않습니다.