【发布时间】:2020-04-08 04:39:11
【问题描述】:
我有两个程序,一个用于服务器,另一个用于客户端。
服务器向客户端发送文件。在客户端中,我使用了TIdTCPClient、TIdThreadComponent 和TIdAntiFreeze 组件。
文件创建良好,但线程永远不会结束。调试时,我从来没有到过Fs.Free。
这是我的客户端代码:
procedure TForm1.IdThreadComponentRun(Sender: TIdThreadComponent);
var
MsgDuServeur: string;
Taille: Integer;
Fs : TFileStream;
begin
MsgDuServeur:= Trim(IdTCPClient.IOHandler.ReadLn(nil));
MemoService.Lines.Add('Serveur : ' + MsgDuServeur);
if (MsgDuServeur = 'RECUP_ENCOURS') then
begin
try
Fs:= TFileStream.Create('C:\temp\client\1test.cds', fmCreate);
try
IdTCPClient.IOHandler.LargeStream:= True;
Taille:= IdTCPClient.IOHandler.ReadInt64();
IdTCPClient.IOHandler.ReadStream(Fs, -1, False);
IdThreadComponent1.Active:= False;
finally
Fs.Free;
end;
except
on E: Exception do
_MessageDlg(E.message, mtWarning, [mbOK], 0);
end;
end;
end;
这是我的服务器代码
procedure TServiceServeurTrf.IdTCPServerExecute(AContext: TIdContext);
var
Flux: TMemoryStream;
LStreamSize : int64;
begin
try
// Transfert de fichiers volumineux
Context.Connection.Socket.WriteLn('RECUP_ENCOURS');
AContext.Connection.IOHandler.LargeStream:= True;
Flux:= TMemoryStream.Create;
try
Flux.LoadFromFile(C:\Windows\Temp\Transfert\3000\1test.cds);
Flux.Position:= 0;
AContext.Connection.IOHandler.Write(Flux.Size);
AContext.Connection.IOHandler.Write(Flux, 0, True);
finally
FreeAndNil(Flux);
end;
except
EcrireLog('Erreur');
end;
end;
我删除了防冻剂,在 ReadStream() 之后我使用 IdThreadComponent1.Active:= False;现在好啦。 怎么同步?事实上,我想使用带有 IdTCPClientWork、IdTCPClientWorkBegin、IdTCPClientWorkEnd 的进度条,但我看不到它的进度
【问题讨论】:
-
请edit您的问题也显示发送文件的服务器代码。但是,当您知道要发送的文件大小时,为什么要将
ReadStream()的AReadUntilDisconnect参数设置为True?它应该是False。更好的是,如果您设置AByteCount=-1和AReadUntilDisconnect=False(默认值),那么ReadStream()将为您处理ReadInt64()。 -
另外,仅供参考,对
MemoService.Lines.Add()和MessageDlg()的调用需要与主UI 线程同步,它们不能在工作线程中安全使用。如果你也在使用线程,为什么还要使用TIdAntiFreeze? -
谢谢,我按照你的 cmets 修改了我的源代码
-
我给你发了答案。