Delphi使用线程保持最后一个ListBox项

时间:2014-10-16 10:45:20

标签: multithreading delphi

我正在尝试使用多线程与delphi制作这个程序它似乎不会经历多个项目,而是每次都经过最后一个而不是选择多个

你可以看到它将解释它只会到达最后一个而不是其他项目的图片

任何帮助都非常感谢!

procedure TForm1.Button1Click(Sender: TObject);
var
Index2: Integer;
begin
 for Index2 := 0 to ListBox2.Items.Count - 1 do
 begin
   ListBox2.ItemIndex := Index2;
   LastName := ListBox2.Items.Strings[Index2];
   with T1.Create do
     FreeOnTerminate := True;
  end;
end;

PIC OF THE ERROR

1 个答案:

答案 0 :(得分:0)

您的程序运行列表框中的4个项目,并且对于每个项目,它启动一个线程(在后台运行),然后继续列表框中的下一个项目 - 即使线程尚未完成处理。

如果您在T1线程中读取ListBox2.SelectedIndex,那么它很可能会读取最后一项,因为您的线程很可能只在FOR循环结束后才能读取SelectedIndex。请记住,您正在启动的线程同时作为主线程运行,即。你的主线程并没有突然停止运行只是因为你开始一个新的线程(这是多线程的全部要点)。

相反,您应该在创建线程时将线程的索引传递给线程,方法是重新创建构造函数以接受列表框和/或要处理的项目,或者 - 甚至更好 - 执行从ListBox2读出您需要的数据并将其传递给线程的Create CONSTRUCTOR。您不应该从线程访问VCL组件 - 尤其是如果在主线程中同时更新这些相同的组件(这就是问题)。