2014-10-16 30 views
-4

我想利用多线程用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

+0

问题是什么?你能给出一个完整的程序来证明你所指的行为。 – 2014-10-16 10:48:42

+0

添加了一张图片,我希望你能理解它我希望它能够使用线程来选择多个项目 – Shrekt 2014-10-16 10:56:37

+0

你的代码显示没有尝试选择任何东西。所以,我想这就是问题所在。你所做的就是发射一条线索。那个线程做什么,只有你知道。 – 2014-10-16 10:58:03

回答

0

你的方案,通过在列表框中的4个项目中运行,并为每个项目启动一个线程(在后台运行),然后在列表框下一个项目开始 - 甚至尽管线程还没有完成处理。

如果您在T1线程中读取ListBox2.SelectedIndex,那么它很可能会读取最后一项,因为您的线程在FOR循环完成后很可能只会达到SelectedIndex的读数。请记住,您正在启动的线程正在同时作为主线程运行,即。你的主线程不会因为你开始一个新线程而突然停止运行(这是多线程的关键点)。

相反,您应该通过重新制作Create CONSTRUCTOR来接受列表框和/或要处理的项目来传递线索的索引,以便在创建线程时处理该线索,或者 - 甚至更好 - 执行从ListBox2读取需要的数据并将其传递到线程的Create CONSTRUCTOR。你不应该从线程访问VCL组件 - 尤其是如果在主线程中同时更新了这些相同的组件(这是这里的问题)。