📄 tmultiulunit.pas
字号:
unit TMultiULUnit;
interface
uses
Classes,APFUnit,IdTCPClient,IdSocks,SysUtils,IdComponent,IdGlobal,DB;
type
TMultiULThread = class(TThread)
private
iWorkCount :int64;
iWorkCountMax:int64;
TheULSocket : TIdTcpClient;
//TheScktInfo : TSocksInfo;
TheConnRec : TConnectRec;
TheConnectOpt: TConnectOpt;
TheUlFile : String;
TheSavePath : string;
protected
Procedure ShowULProgress;
procedure ShowDisConnectState;
procedure ShowRefuseState;
procedure ShowNetState;
procedure ShowErrorstate;
Function ConnectThePC(MyTcp:TidTcpClient;
TheConRec:TConnectRec):Boolean;//连接远程主机
Procedure SetConnectOpt(TCPClient:TidTCPClient;TheOpt:TConnectOpt);
procedure Execute; override;
public
procedure TheBeginWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure TheWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
constructor Create(TheConnectRec:TConnectRec;
TheConnOpt:TConnectOpt;TheFile,TheSPath:String);
destructor Destroy; override;
end;
implementation
uses
unit1;
constructor TMultiULThread.Create(TheConnectRec:TConnectRec;
TheConnOpt:TConnectOpt;TheFile,TheSPath:String);
begin
//===============用于全局变量的赋值+1=========
LetULSingle.Acquire;
Form1.ULThreadCount:=Form1.ULThreadCount+1;
LetULSingle.Release;
//===========================================
TheULFile :=TheFile;
TheSavePath :=TheSPath;
TheConnRec :=TheConnectRec;
TheConnectOpt:=TheConnectOpt;
//TheScktInfo:=TSocksInfo.Create;
//TheScktInfo.Authentication:=TheConnectOPt.PUseAuth;//是否代理验证
//TheScktInfo.Host:=TheConnectOpt.ProxyHost;//代理主机
//TheScktInfo.Port:=TheConnectOPt.ProxyPort;
//TheScktInfo.UserID:=TheConnectOPt.PUserID;
//TheScktInfo.Password:=TheConnectOpt.PPassWD;
//TheScktInfo.Version:=TheConnectOpt.PVersion;
TheULSocket:=TIdTcpClient.Create(nil);
TheULSocket.Host:=TheConnectRec.ConHost;
//TheULSocket.UseNagle:=True;
//TheULSocket.SocksInfo:=TheScktInfo;
TheULSocket.OnWork :=TheWork;
TheULSocket.OnWorkBegin:=TheBeginWork;
Self.FreeOnTerminate:=True;
inherited Create(True);
end;
procedure TMultiULThread.Execute;
var
iRet:Integer;
TheFLen:integer;
UpFStream:TFileStream;
begin
if ConnectThePC(TheULSocket,TheConnRec) then//连接成功
begin
try
iRet:=TheULSocket.ReadInteger; //读取验证数
except
self.Terminate;
exit;
end;
if iRet=1 then //验证通过
begin
if Not FileExists(TheULFile) then //如果文件定位失败
begin
self.Synchronize(ShowErrorstate);
self.Terminate;
exit;
end;
try
UpFStream:=TFileStream.Create(TheULFile,fmOpenRead);
TheFLen:=UpFStream.Size;
except
self.Synchronize(ShowErrorstate);
self.Terminate;
exit;
end;
if TheSavePath[Length(TheSavePath)]<>'\' then
TheSavePath:=TheSavepath+'\';
TheULFile:=TheSavePath+ExtractFileName(TheULFile);
try
TheULSocket.Write('文件上传'+EOL);//发送命令
TheULSocket.Write(TheULFile+EOL); //发送上传存储的文件名
TheULSocket.WriteInteger(TheFLen); //发送文件位置
TheULSocket.WriteStream(UpFStream); //发送文件流
except
Synchronize(ShowNetState);
UpFStream.Free;
self.Terminate;
exit;
end;
UpFStream.Free;
end else Synchronize(ShowRefuseState);
end else Synchronize(ShowDisConnectState);
end;
destructor TMultiULThread.Destroy;
begin
//===============用于全局变量的赋值-1=========
LetULSingle.Acquire;
Form1.ULThreadCount:=Form1.ULThreadCount-1;
LetULSingle.Release;
//===========================================
TheULSocket.Disconnect;
TheULSocket.Free;
//TheScktInfo.Free;
inherited destroy;
end;
Procedure TMultiULThread.SetConnectOpt(TCPClient:TidTCPClient;TheOpt:TConnectOpt);
begin
//TCPClient.UseNagle:=TheOpt.UseNagle;
//TCPClient.InterceptEnabled:=TheOpt.UseIntercept;
//TCPClient.SocksInfo.Authentication:=TheOpt.PUseAuth;
//TCPClient.SocksInfo.Host:=TheOpt.ProxyHost;
//TCPClient.SocksInfo.Port:=TheOpt.ProxyPort;
//TCPClient.SocksInfo.Password:=TheOpt.PPassWD;
//TCPClient.SocksInfo.UserID:=TheOpt.PUserID;
//TCPClient.SocksInfo.Version:=TheOpt.PVersion;
end;
Function TMultiULThread.ConnectThePC(MyTcp:TidTcpClient;TheConRec:TConnectRec):Boolean;//连接远程主机
var
ConnectStrList:TStringList;
ConnectStream :TStringStream;
NowStr:String;//记录当前时间
SwapOK:boolean;
begin
Try
ConnectStrList:=TStringList.Create;
except
Result:=False;
exit;
end;
ConnectStrList.Clear;
NowStr:=DateTimeToStr(Now);
ConnectStrList.Add(NowStr);
ConnectStrList.Add(TheConRec.UserName);
ConnectStrList.Add(TheConRec.Password);
Try
ConnectStream :=TStringStream.Create(ConnectStrList.Text);
except
ConnectStrList.Free;
Result:=False;
exit;
end;
ConnectStream.Position:=0;
StrInfoSwap('wqkemail8088',ConnectStream,SwapOK);
if not SwapOK then
begin
ConnectStream.Free;
ConnectStrList.Free;
Result:=False;
exit;
end;
MyTcp.Disconnect;
MyTcp.Host:=TheConRec.ConHost;
MyTcp.Port:=TheConRec.ConPort;
SetConnectOpt(MyTcp,TheConnectOpt);//设置代理或加密的附加信息
Try
MyTcp.Connect;
except
ConnectStream.Free;
ConnectStrList.Free;
Result:=False;
exit;
end;
Try
MyTcp.WriteInteger(ConnectStream.Size);
MyTcp.WriteStream(ConnectStream);
except
ConnectStream.Free;
ConnectStrList.Free;
Result:=False;
exit;
end;
ConnectStream.Free;
ConnectStrList.Free;
Result:=True;
end;
procedure TMultiULThread.TheBeginWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
iWorkCountMax:=AWorkCountMax;
end;
procedure TMultiULThread.TheWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
iWorkCount:=AWorkCount;
Synchronize(ShowULProgress);
end;
procedure TMultiULThread.ShowDisConnectState;//设置连接失败信息
begin
With Form1 do
begin
if UpCDS.Active=False then UpCDS.Open;
UpCDS.DisableControls;
UpCDS.First;
Repeat
if UpperCase(UpCDS.FieldByName('ULoadFile').AsString)
=UpperCase(TheULFile) then
begin
UpCDS.Edit;
UpCDS.FieldByName('States').AsString:='连接失败';
UpCDS.SaveToFile(TheUpLoadRecFile);
break;
end;
UpCDS.Next;
until UpCDS.Eof;
UpCDS.EnableControls;
end;
end;
procedure TMultiULThread.ShowRefuseState;//设置拒绝连接信息
begin
With Form1 do
begin
if UpCDS.Active=False then UpCDS.Open;
UpCDS.DisableControls;
UpCDS.First;
Repeat
if UpperCase(UpCDS.FieldByName('DLoadFile').AsString)
=UpperCase(TheULFile) then
begin
UpCDS.Edit;
UpCDS.FieldByName('States').AsString:='验证失败';
UpCDS.SaveToFile(TheUpLoadRecFile);
break;
end;
UpCDS.Next;
until UpCDS.Eof;
UpCDS.EnableControls;
end;
end;
procedure TMultiULThread.ShowNetState;//设置网络中断信息
begin
With Form1 do
begin
if UpCDS.Active=False then UpCDS.Open;
UpCDS.DisableControls;
UpCDS.First;
Repeat
if UpperCase(UpCDS.FieldByName('DLoadFile').AsString)
=UpperCase(TheULFile) then
begin
UpCDS.Edit;
UpCDS.FieldByName('States').AsString:='传输中断';
UpCDS.SaveToFile(TheUpLoadRecFile);
break;
end;
UpCDS.Next;
until UpCDS.Eof;
UpCDS.EnableControls;
end;
end;
procedure TMultiULThread.ShowErrorstate;//设置错误信息
begin
With Form1 do
begin
if UpCDS.Active=False then UpCDS.Open;
UpCDS.DisableControls;
UpCDS.First;
Repeat
if UpperCase(UpCDS.FieldByName('ULoadFile').AsString)
=UpperCase(TheULFile) then
begin
UpCDS.Edit;
UpCDS.FieldByName('States').AsString:='文件失效';
UpCDS.SaveToFile(TheUpLoadRecFile);
break;
end;
UpCDS.Next;
until UpCDS.Eof;
UpCDS.EnableControls;
end;
end;
//临时用以下变量
var
TheRatio:Integer;
Procedure TMultiULThread.ShowULProgress;
var
TheRatio8:integer;
TheCDSPos:TBookmark;
begin
TheRatio8:=((iWorkCount*100) div iWorkCountMax);
if TheRatio8=TheRatio then exit;
TheRatio:=TheRatio8;
With Form1 do
begin
if UpCDS.Active=False then UpCDS.Open;
TheCDSPos:=UpCDS.GetBookmark;
UpCDS.DisableControls;
UpCDS.First;
Repeat
if UpperCase(UpCDS.FieldByName('ULoadFile').AsString)
=UpperCase(TheULFile) then
begin
UpCDS.Edit;
UpCDS.FieldByName('States').AsString:='上传..';
UpCDS.FieldByName('ULoadSize').AsInteger:=
(iWorkCount*100 div iWorkCountMax);
if (iWorkCount*100 div iWorkCountMax)=100 then
begin
UpCDS.FieldByName('States').AsString:='上传完毕';
UpCDS.FieldByName('ULoadEndTime').AsDateTime:=now;
UpCDS.SaveToFile(TheUpLoadRecFile);
end;
end;
UpCDS.Next;
until UpCDS.Eof;
UpCDS.GotoBookmark(TheCDSPos);
UpCDS.FreeBookmark(TheCDSPos);
UpCDS.EnableControls;
Update;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -