Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-09-2006
Aldo Aldo is offline
Miembro
 
Registrado: ene 2004
Posts: 46
Poder: 0
Aldo Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 15-09-2006
Aldo Aldo is offline
Miembro
 
Registrado: ene 2004
Posts: 46
Poder: 0
Aldo Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Eventos DCOM Io Providers 3 06-01-2007 00:22:51
Dcom o Sockets Io Varios 0 22-07-2006 16:49:54
Thread bendito thread...se me pierde la ventana Seba.F1 API de Windows 5 02-02-2006 01:16:30
DCOM w98 karocs Providers 1 10-09-2004 01:32:33
Pasar de CORBA a DCOM weke Providers 1 20-05-2004 19:25:13


La franja horaria es GMT +2. Ahora son las 10:30:16.


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
Copyright 1996-2007 Club Delphi