2013-11-27 7 views
1

런타임 스레드를 만들려고했지만 스레드가 이상하게 작동하고 코드에 캔버스 참조가 없습니다.스레드가 데스크탑에 쓰고 있습니다.

procedure TBruteThread.Execute; 
var 
    j: Integer; 
begin 
    inherited; 
    FreeOnTerminate:=True; 
    for j:=1 to StrToInt(Form1.Edit1.Text) do begin 
    if Terminated then break; 
    Form1.Label2.Caption:=IntToStr(j); 
    end; 
    Form1.Label2.Caption:='Thread is destroyed'; 
    Self.Terminate; 
end; 

enter image description here

사람이 이상한 문제를 해결하기 위해 어떤 생각을 가지고?

+1

어딘가에 누군가가 이걸 의도적으로하고 싶어합니다. –

+3

VCL 및 스레드에 대한 자세한 내용은 ['Thread-safe in delphi'] (http://stackoverflow.com/q/17705197/576719)를 참조하십시오. –

답변

5

코드의 문제점은 VCL 스레딩 규칙을 위반한다는 것입니다. VCL 구성 요소에 대한 액세스는 주 스레드에서 이루어져야합니다. Synchronize 또는 Queue (TThread의 메소드)를 사용하여 메인 스레드에서 GUI 업데이트를 실행하십시오.

기타 의견 : 스레드 방식 외부

  • 설정 FreeOnTerminate.
  • 스레드 메서드의 마지막 동작으로 Terminate를 호출하는 것은 의미가 없습니다. 스레드가 막 종료됩니다.
+0

정말 문제는 동기화되지 않은 방법입니다. 감사합니다. – Rafael

+2

'Execute()'의'FreeOnTerminate' 설정은 완벽하고 안전합니다. Execute()가 끝날 때까지 평가되지 않습니다. 'Execute()'의 끝에서'Terminate()'를 호출 할 때,'Execute()'가 종료 된 후에'Terminated' 속성을보고'Execute()'가 종료했는지 여부를 알면 유용 할 수 있습니다. 우아하게 (gracefully or not), 특히'FatalException' 속성을 가지고 있지 않은 이전 버전에서는 그렇습니다. –

+0

@Remy 외부의 코드는 FreeOnTerminate에 대해 알아야하기 때문에 대부분 외부에서 설정하는 것이 좋습니다. –

관련 문제