2013-10-18 25 views
3

我在做一個需要通過tcp/ip進行通信的應用程序。這個程序有一個參數模式形式,它獲取服務器的IP地址,需要的數據以及用於測試連接的測試按鈕。 該測試按鈕調用一個函數來檢查服務器是否處於活動狀態,並且我想用pbstMarquee樣式顯示一個帶有典型進度條的表單,表明您正在嘗試建立連接。 這是測試按鈕的代碼:爲什麼我的選取框進度條不動畫?

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; 

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的代碼

問題是這個表單保持不活動,我的意思是不移動進度條,就像等待她完成這個過程。我試圖把一個GIF,並沒有什麼,沒有人讓我編輯TEDIT ....

對不起我的英語

回答

4

進度條需要GUI線程來服務它的消息隊列。進度條不刷新的事實表明GUI線程沒有爲其隊列提供服務。

隊列未被服務的原因是GUI線程忙於阻塞套接字通信。由於Indy使用阻塞協議,因此只要從GUI線程使用Indy,就無法解決此問題。

解決方案?把你的阻塞通信放在不同的線程中。這允許您爲GUI線程的消息隊列提供服務。

+0

我該怎麼做? – elcharlie

+0

@elcharlie,請參閱['Delphi(Indy)TIdTCPClient in thread'](http://stackoverflow.com/q/11753219/576719)。 –

+0

使用線程的另一種方法是使用Indy的TIdAntiFreeze組件,它允許在套接字阻塞UI時繼續處理消息隊列。 –