delphi - 为什么我的选取框进度条没有动画?

标签 delphi

我正在做一个必须通过 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 ....

对不起我的英语

最佳答案

进度条需要 GUI 线程来为其消息队列提供服务。进度条不刷新表明 GUI 线程未为其队列提供服务。

队列未得到服务的原因是 GUI 线程正忙于阻塞套接字通信。由于 Indy 使用阻塞协议(protocol),只要您从 GUI 线程使用 Indy,就根本没有办法解决这个问题。

解决方案?将阻塞通信放在不同的线程中。这允许您为 GUI 线程的消息队列提供服务。

关于delphi - 为什么我的选取框进度条没有动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19445228/

相关文章:

delphi - Delphi 2010 中的 Indy IdHttp Post 问题

objective-c - 主要编译器供应商使用哪些内存管理算法?

delphi - 为 Delphi 应用程序设置帮助

delphi - TCP服务器和Error1400

delphi - 我怎样才能让我的delphi应用程序使用FTPS而不是FTP(indy)

delphi - 在delphi XE3中导入wsdl文件

delphi - 主应用程序单元结束后可以捕获异常吗?

delphi - 如何显示 Windows 照片打印向导?

delphi - 使用 1 个数据副本同步多个 VirtualStringTree

delphi - 在使用运行时包构建时,如何让我的程序使用更少的内存?