1 每个线程用一个不同的文件名(001-999等等),最后组合起来。
2 用内存映象文件(FileOpen)用共享方式打开。

解决方案 »

  1.   

    不是这个问题,是每个线程下载一个文件,同时下载多个文件。
    这样strings.count引发的公用问题!
      

  2.   

    TStrings好象不是线程安全的吧……
    有一个线程安全的LIST,BUT我忘了名字了……:)
      

  3.   

    那个我知道,不过这样的话我就要把strings的代码重写一遍了!
      

  4.   

    你不要用TStrings,直接把文件名保存在Thread里就可以了。
      

  5.   

    TCriticalSession Method:type
      TForm1 = class(TForm)
      private
        FLockObj: TCriticalSession;
        procedure Lock;
        procedure UnLock;    
        ..
      end;TMyThread = class(Thread)
    private
      FOwnerForm: TForm1;
      FFileName: TStrings;
      ..
    end;
     
    procedure TForm1.OnCreate(Sender: TObject);
    begin
      FLockObj: TCriticalSession.Create;
    end;
    procedure TForm1.Lock;
    begin
      FLockObj.Enter;
    end;
    procedure TForm1.UnLock;
    begin
      FLockObj.Leave;
    end;
    constructor TMyThread.Create;
    begin
      FFileName := TStringList.Create;
      ...
    end;procedure TMyThread.SomeProcOrFunc;
    var
      I: Integer;
    begin
      FOwnerForm.Lock;
      try
        FFileName.Add('a new filename');
        for I := 0 to FFileName.Count - 1 do
        ....
      finally
        FOwnerForm.UnLock;
      end;
    end;
    TThreadList Method:type
      TMyThread = class(TThread);
      private
        ThreadLock: TThreadList;
        ...
      end;
    constructor TMyThread.Create;
    begin
      ThreadLock := TThreadList.Create;
      .. 
    end;do some thing
    begin
      ThreadLock.Add(FFileName);
      try
        with ThreadLock.LockList do
        begin
          FFileName.Add('');
          for I := 0 to FFileName.Count - 1 do
          ...
        end;
      finally
        ThreadLock.UnlockList;
      end;
    end;
      

  6.   

    不是TCriticalSession,是TRTLCriticalSection。用它挺好的,我建议你学习一下。
      

  7.   

    错了,呵我是copy过来的以上的TCriticalSession都是TCriticalSection,(uses SyncObjs)