Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Thread y servidor DCOM externo al proceso ( EXE ) (https://www.clubdelphi.com/foros/showthread.php?t=35436)

Aldo 11-09-2006 12:29:44

Thread y servidor DCOM externo al proceso ( EXE )
 
Hola a todos:

Estoy trabajando con Delphi5 y tengo una aplicación en la que he creado un Thread y en éste el método Execute llama a un procedimiento que se encarga de ejecutar un método de un servidor DCOM externo al proceso ( EXE ).

El problema con el que me he encontrado es que cuando el servidor DCOM era Interno al proceso ( DLL ) no ocurría ningún error, pero al cambiar el servidor DCOM a externo ( EXE ), me dá el siguiente mensaje de error en el IDE de delphi "...No se puede hacer una llamada de salida desde la aplicación que está ejecutando una llamada de sincronización de entrada...".

La verdad es que me ha sido imprescindible cambiar el servidor DCOM de DLL a EXE y no puedo regresar a DLL, por condiciones de instalación de la aplicación.

Para ejemplificar un poco más os pongo un fragmento del código fuente.

En este caso es el método Execute del Thread.

Código Delphi [-]
procedure TMyThread.Execute;
const
   MSEGUNDOS = 60000;
var
   I              : Integer;
   FirstTickCount : DWORD;
begin
   I              := 0;
   FirstTickCount := GetTickCount;
   while ( not Terminated ) do
   begin
      if I = 0 then
         Synchronize( ActNivelesBatterySignalAndSMS );

      I := ( GetTickCount - FirstTickCount );

      if ( I >= MSEGUNDOS ) or Reiniciar then
         begin
            I              := 0;
            FirstTickCount := GetTickCount;
            FReiniciar     := False;
         end;
   end;
end;

Y este es el procedimiento ActNivelesBatterySignalAndSMS. NOTA: Al llegar aquí ya el servidor DCOM ha sido creado satisfactoriamente en otro fragmento del programa, pero por no abrumar con demasiado código no lo pongo aquí.

Código Delphi [-]
procedure TMyThread.ActNivelesBatterySignalAndSMS;
var
   nValue        : Integer;
   pErrorEstruct : ErrorEstruct;
   nIndex        : Integer;
   szColSMS      : WideString;
   MsgIdle    : TMessageIdle;
begin
   // Crear una ventana stayonTop para mostrar un mensaje mientras se están 
   // ejecutando los métodos del Servidor DCOM 
   MsgIdle := TMessageIdle.Create;     
   with MsgIdle do
   try
      MessageIdle    := MSG_CARGANDO_MENSAJES_SMS;
      VisibleMsgIdle := True;
      
      // NOTA: Justo aquí es donde dá el error que me lleva a preguntar en este foro
      if Succeeded( FCoServer.ObtenerNivelCargaBateria( nValue, pErrorEstruct ) ) then
         begin
            FFRM.bsEstadoMovil.BatteryCharge := nValue;
            FFRM.CargarBateria;
         end
      else
         begin
            FFRM.ProcesaMensaje( pErrorEstruct );
            FFRM.FormDestroy( FFRM );
            Exit;
         end;

      if Succeeded( FCoServer.ObtenerNivelCalidadSenal( nValue, pErrorEstruct ) ) then
         begin
            FFRM.bsEstadoMovil.SignalQuality := nValue;
            FFRM.CargarSenal;
         end
      else
         begin
            FFRM.ProcesaMensaje( pErrorEstruct );
            FFRM.FormDestroy( FFRM );
            Exit;
         end;

      nIndex := FFRM.tvMensajes.Selected.AbsoluteIndex - 1;

      if nIndex >= 0 then
         begin
            if Succeeded( FCoServer.ObtenerListaSMS( nIndex, szColSMS, pErrorEstruct ) ) then
               FFRM.LoadSMS( szColSMS )
            else
               begin
                  FFRM.ProcesaMensaje( pErrorEstruct );
                  FFRM.FormDestroy( FFRM );
                  Exit;
               end;
         end
      else
         FFRM.LoadSMS( '' );
   finally
      FreeAndNil( MsgIdle );
   end;
end;

Os agradezco de antemano que me podáis ayudar y que me dediquéis un poco de vuestro tiempo.

Gracias. Aldo

Aldo 15-09-2006 17:39:47

Respondiéndome
 
Soy yo mismo: para decir que en vista de que no he podido encontrar una respuesta al problema y debido a la premura que tengo por terminar esto, me he replanteado un poco la historia y he logrado resolver "momentáneamente" el asunto, pasando de una ventana StayOnTop a una Modal y eliminando el Tread para poner un Timer y así no da el error que me llevó a plantear esta pregunta.

No es la solución que me gustaría haber encontrado, pero es la que hay...de momento.


La franja horaria es GMT +2. Ahora son las 14:13:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi