我无法理解它是如何工作的。
首先一个非常简单的例子,试图更好地解释我的情况。此代码位于新项目中创建的新表单 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”,而不是依次执行“线程 1”、“线程 2”、“线程 3”3 次?
为什么我要问这个?我有一个对象已经有一个正常工作的过程。但是现在我发现我需要处理这个对象的列表。当然可以一个一个地工作,但在我的情况下,它们是彼此独立的,所以我想“嗯,让我们把它们放在线程中,这样它会运行得更快”。
为了避免修改对象以扩展TThread并覆盖Execute,我查找了如何使用过程而不是从 TThread 继承并找到匿名线程的对象来执行线程。对一个对象非常有效,但是当我尝试遍历我的对象列表时,会发生奇怪的行为。
这具有相同的效果。
for Index := 1 to 3 do
TThread.CreateAnonymousThread(
procedure
var
Ob : TOb;
begin
OB := TOb.Create('Thread ' + IntToStr(Index));
OB.Go;
end
).Start;
当然我没有清理对象,这只是我正在运行的一些测试。有任何想法吗?或者在这种情况下,我需要从TThread继承并覆盖Execute方法?
有趣的是,这运行得很好。
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