Ver Mensaje Individual
  #2  
Antiguo 02-03-2009
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Reputación: 18
rolandoj Va por buen camino
Smile Una solución indirecta

Hola,

Bueno, veo que nadie sabe nada, o a nadie le interesa. De todas formas, por si en algún momento le lelga a servir a alguien, les cuento la solución que encontre:

Se trata de una solución indirecta; es decir, no pude determinar la causa específica y por ende no está resuelto como debería ser. En su lugar, lo que hago es una solución práctica : Reinicializar el software de comunicaciones en el equipo cliente:

La estructura del código Delphi es algo como esto:

Código Delphi [-]
   Intentos := 0;
   Repeat
         ItsOk := False;
         Try
            MyIdHTTP.Post(....);
            ItsOk := True;
         Except
            ....
            ...
            On E:EIdSocketError Do Begin
               ....
               ..
               Inc(Intentos);
               if E.LastError = 10054 then Begin
                  RemoveComponent(MyIdHTTP);
                  MyIdHTTP.Free;
                  MyIdHTTP := Nil;
                  MyIdHTTP := TIdHTTP.Create(Self);
               End;
            End;
            ...
            ,,
         End;
  Until (Intentos > 4) Or ItsOk;

Aquí, el truco es que atrapar primero el error 10054, lo que se hace atrapando su clase de error EIdSocketError, y luego preguntado si es el 10054.

Luego, se debe liberar el componente TIdHTTP y volver a crearlo. Aquí, el truco es usar primero RemoveComponent porque nuestro Componente está en un TDataModule, luego hay que extraerlo de ahí, antes de liberarlo con el free.

Lo del "MyIdHTTP := Nil;" no es realmente necesario dado que se reasigna enseguida; pero yo lo uso por metodología, ya que en general, al liberar memoria se debe uno asegurar que realmente quede en Nil el pointer.

No sobra comentar que en una versión de prueba le había puesto un ShowMessage que, cada vez que atrapaba al 10054, me avisaba que se había producido, así pude darme cuenta que con el truco explicado, el sistema sigue trabajando bien después de presentarse el error.
Responder Con Cita