Z
zhmymichael
Unregistered / Unconfirmed
GUEST, unregistred user!
各位富翁前辈,我现在在做TIdFTP多线程Ftp下载,目前遇到的问题是:1、线程并不是同步执行,而是等到一个线程执行完毕之后,另一个线程再运行。2、每一个线程下载的文件不是预先设定的大小,而是整个文件的大小,从而导致有多少线程下载多少遍文件。我的线程执行函数和下载函数如下:我在thread.execute函数中 CS.Enter; //进入临界区 synchronize DownLoadFile; CS.Leave;互斥的去调用DownloadFile函数,其内容如下://下载函数procedure MyThread.DownLoadFile();var tStream: TFileStream; TIdFTP1: TIdFTP; n1,n2:integer;begin //ftp方式下载 TIdFTP1 := TIdFTP.Create(nil); frmModel.IdAntiFreeze1.OnlyWhenIdle:=False;//设置使程序有反应 if FileExists(temFileName) then //建立文件流 begin tStream := TFileStream.Create(temFileName, fmOpenWrite); tResume := True; end else tStream := TFileStream.Create(temFileName, fmCreate); TIdFTP1.Username:= frmModel.UserIDEdit.Text; TIdFTP1.Password:= frmModel.PasswordEdit.Text; TIdFTP1.Host := frmModel.sIP; TIdFTP1.Connect; TIdFTP1.ChangeDir('zmy'); TIdFTP1.TransferType := ftBinary; frmModel.BytesToTransfer:=tlast-tstart; TIdFTP1.OnWorkBegin := frmModel.IdFTP1WorkBegin; TIdFTP1.OnWork := frmModel.IdFTP1Work; TIdFTP1.OnWorkEnd := frmModel.IdFTP1WorkEnd; TIdFTP1.sendCmd('rest 100/r/n'); TIdFTP1.sendCmd('SIZE '+frmModel.sFileName+'/r/n'); TIdFTP1.sendCmd('PASV/r/n'); TIdFTP1.SendCmd('TYPE I'+'/r/n'); TIdFTP1.SendCmd('rest '+inttostr(tstart)+'/r/n'); //下载的起始点 TIdFTP1.sendCmd('RETR '+frmModel.sFileName+'/r/n'); try if tResume then //续传 begin tStream.Position := tStream.Size; TIdFTP1.SendCmd('rest '+inttostr(tStream.Position)+'/r/n'); //下载的起始点 TIdFTP1.Get(frmModel.sFileName, tStream, True); end else begin TIdFTP1.Get(frmModel.sFileName, tStream, True); end; finally tStream.Free; end;end;恳请高手解答,如果有完整的例子更好。我全部的家当200分就这些了。麻烦各位富翁了。(在线等)