⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ut_cltthrd.~pas

📁 罗小平<<delphi精要>>一书源码
💻 ~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: 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;
  CurrReadSize{/B}: Integer;
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 + -