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
MsgIdle := TMessageIdle.Create;
with MsgIdle do
try
MessageIdle := MSG_CARGANDO_MENSAJES_SMS;
VisibleMsgIdle := True;
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