我无法按照它的工作方式。与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 –
可能不会,或者您首先不会问这个问题。 –