📄 ut_cltthrd.pas
字号:
unit UT_CLTTHRD;
interface
uses
Classes, ScktComp;
type
TClientThread = class(TThread)
private
CltSocket: TClientSocket;
FilesName: TStrings;
FilesStrm: Array of TFileStream;
FilesLength: Array of Integer;
Fileth, AllFilesLength, FileCurrLength, CurrReadSize{/B}: Integer;
GaugeStepRate: Double;
ParentDir: String;
procedure Init(LengthText: String);
procedure StepProgressToEnd;
procedure StepProgress;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean; ClientSocket: TClientSocket; AParentDir: String);overload;
destructor Destroy; override;
end;
implementation
uses SysUtils, FundAndProc, UT_DL_CLT;
constructor TClientThread.Create(CreateSuspended: Boolean; ClientSocket: TClientSocket; AParentDir: String);
begin
ParentDir := AParentDir;
inherited Create(CreateSuspended);
CltSocket := ClientSocket;
end;
destructor TClientThread.Destroy;
var
I: Integer;
begin
CltSocket.Close;
for I := Low(FilesStrm) to High(FilesStrm) do
FreeAndNil(FilesStrm[I]);
FreeAndNil(FilesName);
inherited;
end;
procedure TClientThread.Execute;
var
pStream: TWinSocketStream;
ReadBuffer: Pointer;
ReadText, TaskName, SendText: String;
Start, FileReading: Boolean;
const
ReadLen = 4*1024;
begin
Start := False;
FileReading := False;
pStream := TWinSocketStream.Create(CltSocket.Socket, 60000);
try
while (not Terminated) and CltSocket.Active do
begin
if not Start then
begin
SendText := KEY_Clt[1];
pStream.Write(SendText[1], Length(SendText));
Start := True;
end;
ReadBuffer := AllocMem(ReadLen);
if pStream.WaitForData(6000) then
begin
CurrReadSize := pStream.Read(ReadBuffer^, ReadLen);
if FileReading then
begin
Inc(FileCurrLength, FilesStrm[Fileth].Write(ReadBuffer^, CurrReadSize));
Synchronize(StepProgress);
if FileCurrLength >= FilesLength[Fileth] then
begin
Inc(Fileth);
FileCurrLength := 0;
end;
if Fileth = FilesName.Count then
begin
SendText := KEY_Clt[4];
pStream.Write(SendText[1], Length(SendText));
Synchronize(StepProgressToEnd);
Terminate;
end else
begin
SendText := KEY_Clt[3];
pStream.Write(SendText[1], Length(SendText));
end;
end else
begin
ReadText := PChar(ReadBuffer);
TaskName := Copy(ReadText, 1, Length(KEY_Srv[1]));
if TaskName = KEY_Srv[1] then //文件名
begin
Delete(ReadText, 1, Length(KEY_Srv[1]));
FilesName := TStringList.Create;
FilesName.Assign(StringToStrings(FilesNameSepStr, ReadText));
SendText := KEY_Clt[2];
pStream.Write(SendText[1], Length(SendText));
end else if TaskName = KEY_Srv[2] then //文件长度
begin
Delete(ReadText, 1, Length(KEY_Srv[1]));
Init(ReadText);
SendText := KEY_Clt[3];
pStream.Write(SendText[1], Length(SendText));
FileReading := True;
end;
end;
end;
FreeMem(ReadBuffer);
end;
finally
pStream.Free;
CltSocket.Close;
end;
end;
procedure TClientThread.Init(LengthText: String);
var
I: Integer;
Lengths: TStrings;
begin
SetLength(FilesStrm, FilesName.Count);
SetLength(FilesLength, FilesName.Count);
Lengths := StringToStrings(FilesLengthSepStr, LengthText);
Fileth := 0;
FileCurrLength := 0;
AllFilesLength := 0;
for I := 0 to FilesName.Count-1 do
begin
FilesName[I] := ParentDir + '\' + FilesName[I];
FilesStrm[I] := TFileStream.Create(FilesName[I], fmCreate);
FilesLength[I] := StrToInt(Lengths[I]);
Inc(AllFilesLength, FilesLength[I]);
end;
GaugeStepRate := FM_DL_CLT.ggCopy.MaxValue / AllFilesLength;
FreeAndNil(Lengths);
end;
procedure TClientThread.StepProgress;
begin
with FM_DL_CLT.ggCopy do
Progress := Progress + Round(GaugeStepRate*CurrReadSize);
end;
procedure TClientThread.StepProgressToEnd;
begin
FM_DL_CLT.InitUI(2);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -