在主线程中有一个Tstringlist: lst1有线程1 :Thread1 负责更新lst1 的数据
用的:
form1.lst1.clear;
for i:=0 to ... do
begin
form1.lst1.add...
end;再有线程:Thread2 需要读取这个lst1我在Thread2 中定义了一个 Tstringlist: lst2
有个过程:Getlist 内容为:
lst2.assign(form1.lst1);然后用: Synchronize(Getlist) 取得数据进行操作。但是总是会有越界的情况发生。这怎么办?
Message: List index out of bounds (27).。2个线程更新 这个lst1 频率都很快。大概每300MS一次。
用的:
form1.lst1.clear;
for i:=0 to ... do
begin
form1.lst1.add...
end;再有线程:Thread2 需要读取这个lst1我在Thread2 中定义了一个 Tstringlist: lst2
有个过程:Getlist 内容为:
lst2.assign(form1.lst1);然后用: Synchronize(Getlist) 取得数据进行操作。但是总是会有越界的情况发生。这怎么办?
Message: List index out of bounds (27).。2个线程更新 这个lst1 频率都很快。大概每300MS一次。
var
list:TList;
begin
ttl:=TThreadList.Create;
List:=ttl.LockList;
try
//do something
finally
ttl.UnlockList;
end;
end;
2、利用TThread的Synchronize,它的作用是在主线程中执行一个方法
3、利用通讯来完成。例如我们可以利用消息,如在线程的Execute方法,在它的循环执行完毕之后,我们可以发送一个自定义消息,然后窗口处理这个消息。
private
procedure GetResut;//我们声明了一个过程GetResutlt;它不包含任何参数
protected
procedure Execute;override;
end;
var
Form1: TForm1;
Ci : array[0..1000] of integer;//一个全局变量,我们将用TFrist来访问它//GetResut的实现部分
procedure Tfrist.GetResut;
var
i : integer;
begin
for I := 0 to 1000 do
Form1.ListBox1.Items.Add(IntToStr(ci[i]))
end;procedure Tfrist.Execute;
var
i : integer;
begin
inherited;
//OnTerminate := Form1.ThreadDone;
// FreeOnTerminate := true;
for i := 0 to 1000 do
ci[i] := i;
//调用Synchronize
Synchronize(GetResut);
end;