在主线程中有一个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一次。

解决方案 »

  1.   

    ttl:TThreadList;
    var
      list:TList;
    begin
      ttl:=TThreadList.Create;
      List:=ttl.LockList;
      try
        //do something
      finally
        ttl.UnlockList;
      end;
    end;
      

  2.   

    1、利用TThread的OnTerminate属性,它是一个TNofityEvent类型,它指定的过程将在线程执行完毕之后运行,并且是运行在主线程环境中的,我上面的代码就是使用了这种方法
    2、利用TThread的Synchronize,它的作用是在主线程中执行一个方法
    3、利用通讯来完成。例如我们可以利用消息,如在线程的Execute方法,在它的循环执行完毕之后,我们可以发送一个自定义消息,然后窗口处理这个消息。
      

  3.   

    Tfrist = class(TThread)
        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;
      

  4.   

    简单点可以用delphi封装的TCriticalSection类来做同步。