unit DownloadThread; interface uses Classes, ExtendedFileTransferLibrary_Intf, uROTypes; type TDownloadThread = class(TThread) private { Private declarations } fThreadNumber: integer; fFileName: string; fPartNumber: integer; fPartSize: integer; fURL: string; fPart: Binary; fMessage: string; fDone: boolean; private procedure WritePartSynchronized; procedure WriteLogSynchronized; overload; procedure WriteLogSynchronized(msg: string); overload; protected procedure Execute; override; public constructor Create(const aThreadNumber: integer; const aFileName: string; const aPartNumber: integer; const aPartSize: integer; aURL: string); property Done: boolean read fDone; end; implementation uses SysUtils, fClientForm, uROClasses, uROWinInetHTTPChannel, uROBinMessage, Forms; constructor TDownloadThread.Create(const aThreadNumber: integer; const aFileName: string; const aPartNumber, aPartSize: integer; aURL: string); begin inherited Create(true); FreeOnTerminate := false; fThreadNumber := aThreadNumber; fFileName := aFileName; fPartNumber := aPartNumber; fPartSize := aPartSize; fURL := aURL; fDone := false; end; procedure TDownloadThread.Execute; var ch: TROWinInetHTTPChannel; msg: TROBinMessage; svc: TExtendedFileTransferService_Proxy; begin WriteLogSynchronized('Thread #' + IntToStr(fThreadNumber) + ': downloading chunk ' + IntToStr(fPartNumber)); ch := TROWinInetHTTPChannel.Create(nil); ch.TargetURL := fURL; msg := TROBinMessage.Create; svc := TExtendedFileTransferService_Proxy.Create(msg, ch); try fPart := (svc as IExtendedFileTransferService).DownloadFilePart( {$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(fFileName), fPartNumber, fPartSize); finally ch.Free; msg.Free; end; WriteLogSynchronized('Thread #' + IntToStr(fThreadNumber) + ' download finished, writing to disk'); Synchronize(WritePartSynchronized); WriteLogSynchronized('Thread #' + IntToStr(fThreadNumber) + ' completed.'); fPart.Free; fDone := true; end; procedure TDownloadThread.WriteLogSynchronized; begin ClientForm.LogMessage(fMessage); Application.ProcessMessages; end; procedure TDownloadThread.WriteLogSynchronized(msg: string); begin fMessage := msg; WriteLogSynchronized; end; procedure TDownloadThread.WritePartSynchronized; begin ClientForm.WriteChunk(fPartNumber, fPartSize, fPart); end; end.