2013-11-27 20 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和線程的更多信息,請參見['delphi中的線程安全](http://stackoverflow.com/q/17705197/576719)「。 –

回答

5

您的代碼存在的問題是它打破了VCL線程規則。必須從主線程訪問VCL組件。使用同步或隊列(TThread的方法)在主線程上執行GUI更新。

其他評論:

  • 線程方法外集FreeOnTerminate。
  • 調用終止作爲線程方法的最終行爲是毫無意義的。線程即將終止。
+0

真的,問題是不同步的方法。 謝謝。 – Rafael

+2

在Execute()裏面設置'FreeOnTerminate'是完全安全的。直到'Execute()'退出後纔會對其進行評估。至於在Execute()的末尾調用Terminate(),如果在Execute()出口後查看Terminated屬性以知道Execute()是否退出優雅與否,特別是在沒有'FatalException'屬性的舊版本中。 –

+0

@Remy由於外部代碼需要了解FreeOnTerminate,所以在我看來,將它設置在外部是非常有意義的。 –