程序大概如下...不知為如在执行時老是download兩個(線程為二)0kb的檔...
有沒有人可以救救小妹丫...急....><"
function tform1.GetFileSize(aURL: string): longint;
var
FileSize : integer;
begin
FileSize := IdFTP1.size(aurl);
IdFTP1.Abort;
Result := FileSize;
end;procedure TForm1.DirectoryListBoxDblClick(Sender: TObject);
var
m:integer;Name: String;
begin
 if not IdFTP1.Connected then exit;
  Name := IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName;
  if IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType = ditDirectory then begin
    SetFunctionButtons(false);
    ChageDir(Name);
    SetFunctionButtons(true);
  end
  else begin
   SaveDialog1.FileName := Name;
 if SaveDialog1.Execute then begin
aFile := IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName;
aURL:=aFile;
xx:=2; 
aFileSize := GetFileSize(aURL);
avg := trunc(aFileSize/xx);
end;
   end;
try
GetThread();
while m<=xx do
begin
MyThread[m].Resume; 
m :=m+1;
end;
except
Exit;
end;
end;procedure TForm1.GetThread();
var
  i: integer;
  start: array[1..100] of integer;
  last: array[1..100] of integer;   
  fileName: string;
begin
  i := 1;
  while i <= xx do
  begin
    start[i] := avg * (i - 1);
    last[i] := avg * i -1; 
    if i = xx then
    begin
      last[i] := avg*i + aFileSize-avg*xx; 
    end;
    fileName := aFile + IntToStr(i);
    MyThread[i] := TThread1.create(aURL, aFile, fileName, false, i, start[i],
      last[i]);
    i := i + 1;
  end;
    
end;constructor TThread1.create(aURL, aFile, fileName: string; bResume: Boolean;
  Count, start, last: integer);
begin
  inherited create(true);
  FreeOnTerminate := true;
  tURL := aURL;
  tFile := aFile;
  fCount := Count;
  tResume := bResume;
  tstart := start;
  tlast := last;
  temFileName := fileName;
 end;
procedure TThread1.DownLodeFile();
varTIdFTP1 : TIdFTP;
tStream: TFileStream;
begin
tStream := TFileStream.Create(temFileName, fmCreate);
TIdFTP1.Get(tURL,tStream); 
Form1.DebugListBox.ItemIndex := Form1.DebugListBox.Items.Add(temFileName+'download');
finally
tStream.Free;
end;
end;
procedure TThread1.Execute;
beginsynchronize(DownLodeFile)end;

解决方案 »

  1.   

    你参考一下吧:
    procedure TDownThread.Execute;
    begin
      FreeOnTerminate := True;  IsDown := False;  ftpClient := TIdFTP.Create(nil);  try
        ftpClient.RecvBufferSize := 2048;
        ftpClient.SendBufferSize := 2048;    ftpClient.Host := FServerIp;
        ftpClient.Port := FPort;
        ftpClient.Username := fUserName;
        ftpClient.Password := fPwd;    ftpClient.OnWorkBegin := FtpWorkBegin;
        ftpClient.OnWork := ftpwork;
        ftpClient.OnWorkEnd := FtpWorkEnd;    ftpClient.Connect(True,8000);    ftpClient.ChangeDir(fDir);
        IsDown := True;
        ftpClient.Get(FileName,SavePath+'\'+FileName,True);
        
      finally
        ftpClient.Free;
      end;
    end;procedure TDownThread.FtpWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
      if (AWorkMode = wmRead) and (IsDown = true) then
      begin
         FCurrentSize := AWorkCount;     frm_Main.myLabel[fLines].Caption := fFileName + '  下载进度:'+IntToStr(AWorkCount div 1024 )+'K/'+IntToStr(AllSize div 1024)+'K';
      end;
    end;procedure TDownThread.FtpWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
      //
    end;  procedure TDownThread.FtpWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    begin
      if (AWorkMode = wmRead) and (IsDown = true) then
      begin
        if (fCurrentSize + 2048) >= fAllSize then
        begin
          frm_Main.myLabel[fLines].Caption := fFileName+ '  下载完毕';
          frm_Main.DownCount := frm_Main.DownCount + 1;
          IsDown := False;
        end
        else
        begin
          frm_Main.myLabel[fLines].Caption := fFileName+ '  下载意外终端,请重新下载...';
          frm_Main.DownCount := frm_Main.DownCount + 1;
          IsDown := False;
        end;
      end;
    end;
      

  2.   

    因为,你两个线程都是从文件开始处下载的,虽然你设置了start[i], last[i],但你没有发送相应的命令给FTP服务器。