Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Varios
Register FAQ Members List Calendar Guía de estilo Today's Posts

Coloboración Paypal con ClubDelphi

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 20/02/2014
Red_Leon's Avatar
Red_Leon Red_Leon is offline
Miembro
 
Join Date: Oct 2007
Location: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Vida de un Thread!

Buenos días a todos!

Me preguntaba a ver si alguien me puede echar una mano. He estado buscando por hay y no he encontrado la respuesta y a ver si alguien me puede iluminar un poco en el tema.

He creado un hilo para sincronizar la base de datos del cliente en local con la del servidor, este hilo se estará en ejecución durante toda la vida del programa. El código básicamente es este:

Código Delphi [-]
TThreadSynch = class(TThread)
   private     
     status:TStatusSynch;
     newStatus:TStatusSynch;
   protected
     procedure Execute; override;
   public
     constructor Create(CreateSuspended:Boolean);
     procedure showStatus;
   end;   

constructor TThreadSynchronize.Create(CreateSuspended:Boolean); 
begin
   self.status:=ssInit;
   inherited Create(CreateSuspended);
   self.FreeOnTerminate:=true;
end;  

procedure TThreadSynchronize.Execute; 
begin
   while not Terminated do
   begin
       if Se ha conseguido conectar con el servidor then
       begin
         self.newStatus:=ssConnect;
         synchronize(showStatus);
         if Se debe actualizar la base de datos then
         begin
           self.newStatus:=ssSynchronizing;
           synchronize(showStatus);
           Sincronización de la base de datos
           self.newStatus:=ssConnect;
           synchronize(mostrarEstado);
         end;
       end
       else
       begin
         self.newStatus:=ssNoConnect;
         synchronize(mostrarEstado);
       end;
     {Se duerme el hilo 10 seg}
     sleep(10000);
   end;
   {Terminación del Hilo}
   self.Terminate; 
end;  

procedure TThreadSynchronize.mostrarEstado; 
begin
   if (self.status <> self.newStatus) then   
   begin
     self.status:=self.newStatus;
     Se muestra el estado de la conexión por pantalla;
   end;
end;

Vale, creo que en código no esta nada mal.

Desde un formulario creo este hilo, pero es la única referencia que hago al hilo.

Mi pregunta es, si yo no llamo a al hilo.Terminate, que no lo hago, ¿quien termina este hilo? ¿hasta cuando esta en ejecución?

Yo al cerrar la aplicación, veo como el hilo se termina, la aplicación no se queda bloqueada ni abierta ¿por qué?

Si cierro la aplicación mientras esta sincronizando la base de datos salta este error: "La operación no se puede realizar de forma asincrona" y a continación se cierra la aplicación, dejando la sincronización a medias.

Lo que realmente me gustaría es que la aplicación no se cerrase asta que la sincronización este terminada.

O que el hilo siguiera la ejecución aunque la aplicación estuviese cerrada.

¿Que sería lo mas recomendable y alguna idea de que hacer?

Muchas gracias de antemano.

Red_Leon

Last edited by Red_Leon : 20/02/2014 at 13:39.
Reply With Quote
  #2  
Old 20/02/2014
Neftali [Germán.Estévez]'s Avatar
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Join Date: Jul 2004
Location: Barcelona - España
Posts: 19,478
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Quote:
Originally Posted by Red_Leon View Post
Vale, creo que en código no esta nada mal.

Desde un formulario creo este hilo, pero es la única referencia que hago al hilo.

Mi pregunta es, si yo no llamo a al hilo.Terminate, que no lo hago, ¿quien termina este hilo? ¿hasta cuando esta en ejecución?

Yo al cerrar la aplicación, veo como el hilo se termina, la aplicación no se queda bloqueada ni abierta ¿por qué?

Si cierro la aplicación mientras esta sincronizando la base de datos salta este error: "La operación no se puede realizar de forma asincrona" y a continación se cierra la aplicación, dejando la sincronización a medias.

Lo que realmente me gustaría es que la aplicación no se cerrase asta que la sincronización este terminada.

O que el hilo siguiera la ejecución aunque la aplicación estuviese cerrada.

¿Que sería lo mas recomendable y alguna idea de que hacer?

Muchas gracias de antemano.
Antes de nada, sólo un comentario. Como has puesto pseudocódigo, no se acaba de ver cómo realizas la sincronización de la Base de Datos.
(a) Si la sincronización de la BD la haces con Synchonize piensa que todo ese trabajo se hace en el hilo principal, es decir, no aprovecha realmente el potencial del hilo.
(b) Si la sincronización de la BD la heces desde dentro del hilo, sin Synchronize, piensa que deberás definir conexión y componentes nuevos dentro del hilo, ya que estos no son thread-safe.

El hilo debería terminar cuando finalize su trabajo o cuando alguien se lo indique. Es decir puedes utilizar condiciones como estas en el hilo; Dependerá del trabajo que tenga que realizar y de si "acaba sólo" o no. Si no acaba por sí sólo, alguien (la aplicación principal) deberá llamar al Terminate.

* while not Terminated do begin
* while (not SQL.EOF) do begin
* while (condicion) do begin
* while (true) do begin

Al cerrar tu aplicación la variable del thread se destruirá y eso manda ejecutar de forma automática el Terminate. Revisa el destroy de la clase TThread. de ahí que el thread termine.

De todas formas no seria la manera más correcta de hacerlo, ya que si la aplicación se está cerrando (destruyéndose cosas) y el thread está sincronizando (por ejemplo) puedes tener errores. Para ello creo que deberías mirar la ayuda del método WaitFor.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Reply With Quote
  #3  
Old 20/02/2014
nlsgarcia's Avatar
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Join Date: Feb 2007
Location: Caracas, Venezuela
Posts: 2,206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Red_Leon,

Quote:
Originally Posted by JULIPO
...He creado un hilo para sincronizar la base de datos del cliente en local con la del servidor...este hilo estará en ejecución durante toda la vida del programa...¿quien termina este hilo?...¿hasta cuando esta en ejecución?...¿Que sería lo mas recomendable y alguna idea de que hacer?...
Revisa este link:
Espero sea útil

Nelson.
Reply With Quote
  #4  
Old 21/02/2014
Red_Leon's Avatar
Red_Leon Red_Leon is offline
Miembro
 
Join Date: Oct 2007
Location: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Buenas señores,

Neftali, la sincronización de la base de datos la hago sin Synchronize, sino no me vale para nada como bien dices y es verdad si cierro la aplicación y lo pillo en medio de la sincronización es cuando me da el error de "La operación no se puede realizar de forma asincrona". Voy a buscar información sobre WaitFor. Lo que yo pensaba es que la aplicación no se podría cerrar mientras el hilo esta en ejecución, no que la aplicación destruye todos los hilos aunque esten en ejecución.

nlsgarcia, voy a mirarme ahora mismo los enlaces.

Voy a mirar todas estas cosas y os comento.

Muchas gracias por arrojarme un poco de luz sobre el tema, es la primera vez que utilizo los hilos para estos fines (tenia otros hilos, pero con fines mucho más acotados) y encima tengo que ir deprisa sin poder pararme mucho.

Mil Gracias!
Reply With Quote
  #5  
Old 21/02/2014
Neftali [Germán.Estévez]'s Avatar
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Join Date: Jul 2004
Location: Barcelona - España
Posts: 19,478
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Quote:
Originally Posted by Red_Leon View Post
...Lo que yo pensaba es que la aplicación no se podría cerrar mientras el hilo esta en ejecución, no que la aplicación destruye todos los hilos aunque esten en ejecución.
Mírate el código del Destroy que te he comentado.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
thread calco_hugo Varios 6 26/07/2010 20:12
Thread Paulao Varios 1 09/05/2008 00:42
Thread y showmodal jef Varios 32 07/12/2007 23:55
Thread bendito thread...se me pierde la ventana Seba.F1 API de Windows 5 02/02/2006 00:16
Thread y Form progmaq Varios 4 31/03/2005 14:16


All times are GMT +2. The time now is 10:20.


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