我正在做一个必须通过tcp / ip进行通信的应用程序。该程序有一个参数模态形式,它获取服务器的IP,所需的数据和测试连接的测试按钮。 该测试按钮调用一个函数来检查服务器是否处于活动状态,并且我想显示一个带有pbstMarquee样式的典型进度条的表单,表明您正在尝试建立连接。 这是测试按钮的代码:
procedure TFormConfiguracion.ButtonTestClienteClick(Sender: TObject);
begin
if TestTCPClient(EdIPCliente.Text, EdPasswordProtocolo.Text, EdPuertoCliente.Value,
self) then
begin
MensajeInformacion('Conexión con el Servidor Establecida con Exito!',''); //Ok
else
begin
MensajeError('Error al Conectar con el Servidor!',''); //Error
end;
end;
TestTCP函数的代码:
function TestTCPClient(Host,Password: String; Puerto: Integer; AOwner: TComponent):
Boolean;
var
TCPCliente: TIdTCPClient;
textoEnvio: String;
begin
TCPCliente := TIdTCPClient.Create(nil);
Result := False;
TCPCliente.Host := Host;
TCPCliente.Port := Puerto;
TCPCliente.ConnectTimeout := 20000;
textoEnvio := Trim(Password)+'|TEST|#';
try
ShowFormCompConexion(AOwner, 'Intentando establecer conexión con el equipo
'+Host+'...'); //Trying to connect
TCPCliente.Connect;
TCPCliente.Socket.ReadTimeout := 10000;
TCPCliente.Socket.WriteLn(textoEnvio, TEncoding.ANSI);
if (TCPCliente.Socket.ReadLn(TEncoding.ANSI) = 'OK#') then
Result := True;
CloseFormCompConexion;
except
on E : Exception do
begin
CloseFormCompConexion;
Exit;
end;
end;
end;
以及显示带有进度条的表单的函数代码:
procedure ShowFormCompConexion(AOwner: TComponent; Dato: String);
begin
Form_CompConexion := TFormCompConexion.Create(AOwner);
Form_CompConexion.LbDato.Caption := Dato;
Form_CompConexion.Show;
Form_CompConexion.Repaint;
end;
问题是这个表单保持不活动状态,我的意思是不移动进度条,就像等待她完成这个过程一样。我试图把一个gif,没有任何人让我编辑一个Tedit ....
抱歉我的英文
答案 0 :(得分:4)
进度条需要GUI线程来为其消息队列提供服务。进度条未刷新的事实表明GUI线程没有为其队列提供服务。
队列未被服务的原因是GUI线程忙于阻塞套接字通信。由于Indy使用阻塞协议,只要你从GUI线程中使用Indy,就没有办法解决这个问题。
解决方案?将阻止通信放在不同的线程中。这允许您为GUI线程的消息队列提供服务。