我無法按照它的工作方式。與TThread.CreateAnonymousThread的奇怪行爲
首先是一個非常簡單的例子,以更好地解釋我的情況。 此代碼位於新項目中的新Form Form1中。其中mmo1是備忘錄組件。
TOb = class
Name : String;
constructor Create(Name : String);
procedure Go();
end;
procedure TOb.Go;
begin
Form1.mmo1.Lines.Add(Name);
end;
然後,我有與此事件按鈕:
procedure TForm1.btn4Click(Sender: TObject);
var
Index : Integer;
begin
mmo1.Lines.Clear;
for Index := 1 to 3 do
TThread.CreateAnonymousThread(TOb.Create('Thread ' + IntToStr(Index)).Go).Start;
end;
及我的備忘錄輸出爲:
線程4
線程4
線程4
我真的不明白。
第一個問題:爲什麼「名稱」輸出是:線程4?是1到3的For循環。至少應該是1或3
第二個:爲什麼它只執行最後一個線程「線程4」,而不是順序執行3次「線程1」,「線程2」 ,「線程3」?
爲什麼我問這個?我有一個已經有一個進程正常工作的對象。但是現在我發現我處於需要處理該對象列表的情況。肯定的工作一個接一個很好地進行,但在我的情況下,他們是獨立的其他人之一,所以我想「嗯,讓他們在線程,所以它會跑得更快」。
爲了避免修改對象擴展的TThread和壓倒一切的執行我仰望如何與一個過程,而不是從繼承的TThread發現匿名Thread的對象來執行線程。用一個對象工作真的很棒,但是當我嘗試循環訪問對象列表時,發生了奇怪的行爲。
這也有同樣的效果。
for Index := 1 to 3 do
TThread.CreateAnonymousThread(
procedure
var
Ob : TOb;
begin
OB := TOb.Create('Thread ' + IntToStr(Index));
OB.Go;
end
).Start;
當然,我不乾淨的對象,這只是一些測試,我正在運行。 任何想法?或者在這種情況下,我需要繼承TThread並覆蓋執行方法?
有趣的是,這個運行得很好。
mmo1.Lines.Clear;
TThread.CreateAnonymousThread(TOb.Create('Thread ' + IntToStr(1)).Go).Start;
TThread.CreateAnonymousThread(TOb.Create('Thread ' + IntToStr(2)).Go).Start;
TThread.CreateAnonymousThread(TOb.Create('Thread ' + IntToStr(3)).Go).Start;
輸出:
線程1
線程2
線程3
所有這些示例都顯示**未定義行爲**,因爲您正在從主UI線程外部訪問'TMemo'。所有的結果都是隨機的,可能會導致意想不到的問題。您**必須**與主UI線程同步,例如'TThread.Synchronize()'。但即使如此,您還需要考慮[匿名程序如何綁定到變量](http://docwiki.embarcadero.com/RADStudio/en/Anonymous_Methods_in_Delphi#Anonymous_Methods_Variable_Binding)。 –
所以在我的情況下,ObjectList與我的對象將工作得很好?而我遇到了問題,因爲我試圖用可視化組件進行調試?在這種情況下,使用TMemo的Form1 –
可能不會,或者您首先不會問這個問題。 –