Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
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 14-08-2007
robertosc robertosc is offline
Miembro
 
Registrado: abr 2006
Posts: 36
Poder: 0
robertosc Va por buen camino
Question cuando llamo ejecutar un hilo dentro del proceso del hilo no lo hace

Hola, mi problema es el siguente, espero que alguien me pueda ayudar

voy a tratar de explicar lo mas claro posible

tengo un procedimiento en un hilo que se ejecuta en un servidor cada vez que se hace la peticion desde otra computadora (esa peticion es por medio de sockets que se envian al servidor, puede hacer de varias computadoras hacia el servidor, no solo una), y el procedimiento lo hace bien, el problema es cuando ese procedimiento es llamado de mas de una computadora a la vez, es decir, una computadora llama el procedimiento y se ejetuca el procedimiento y como dura varios minutos, si en ese lapso otra computadora manda la peticion, ya no la ejecuta xk esta activo el proceso, entonces lo que hice es identificar las peticiones y mientras se esta haciendo un proceso, mando los demas a cola y los voy ejecutando despues de que termine de uno por uno.

el problema aqui es que llamo el hilo dentro del procedimiento mismo para ver cuando termine si hay peticiones en cola y las siga ejecutando, parecido a la recursividad, pero no lo es de todo, lo malo aqui es que no funciona, entra al proceso del hilo y lo ejecuta solo una vez, aunque lo llame nuevamente dentro de este

les pongo el codigo para que quede mas claro:

ejecuto el hilo:
Código:
       // variable para saber si esta ejecutandose el procedimiento
        if crtAct=true then
        begin
          frmPrincipal.lbRespaldosCola.Items.Add(ruta);
          exit;
        end;
        crtAct:=true;
        //------------------------------------/
        frmPrincipal.splAvisos.OpenSplitter;
        // llamo el hilo
        HiloCorte:=TActCorte.Create(false);
        {-------------------Borrar los archivos recibidos-------------------}
        DeleteFile(pChar(ExtractFilePath(Application.ExeName)+res));
        DeleteFile(pChar(ExtractFilePath(Application.ExeName)+temp));
        DeleteFile(pChar(ExtractFilePath(Application.ExeName)+'Corte.z'));
        DeleteFile(pChar(ExtractFilePath(Application.ExeName)+'corte.id'));
        {-------------------------------------------------------------------}
        frmPrincipal.tiEsthel.ShowBalloonHint('Aviso','Respaldos y Cortes recibidos de la tienda: '+consGeneral.fieldbyname('tndResponsable').AsString,bitInfo,10);
procedimiento del hilo:
Código:
procedure TActCorte.Execute;
begin
  FreeOnTerminate := True;
  with frmPrincipal do
  begin
    pbAct.Position:=0;
    pbAct.Properties.Max:=1;
    with datos do
    begin
      crearTablaCrt(ruta+'Cliente.db','Cliente');
      crearTablaCrt(ruta+'Operacion.db','Operacion');
      crearTablaCrt(ruta+'Apartado.db','Apartado');
      crearTablaCrt(ruta+'Abono.db','Abono');
      crearTablaCrt(ruta+'Aplicado.db','Aplicado');
      crearTablaCrt(ruta+'DetDevolucion.db','DetDevolucion');
      crearTablaCrt(ruta+'DetTransferencia.db','DetTransferencia');
      crearTablaCrt(ruta+'Devolucion.db','Devolucion');
      crearTablaCrt(ruta+'Movimiento.db','Movimiento');
      crearTablaCrt(ruta+'PagoAbono.db','PagoAbono');
      crearTablaCrt(ruta+'PagoVenta.db','PagoVenta');
      crearTablaCrt(ruta+'ProdApartado.db','ProdApartado');
      crearTablaCrt(ruta+'Transferencia.db','Transferencia');
      crearTablaCrt(ruta+'Venta.db','Venta');
      crearTablaCrt(ruta+'VentaDetalle.db','VentaDetalle');
      crearTablaCrt(ruta+'VentaNota.db','VentaNota');
      crearTablaCrt(ruta+'Mayorista.db','Mayorista');
      crearTablaCrt(ruta+'PedMayorista.db','PedMayorista');
      crearTablaCrt(ruta+'DetPedMayorista.db','DetPedMayorista');
    end;
    frmPrincipal.pbAct.Position:=0;
    frmPrincipal.lblTienda.Caption:='';
    pbAct.Hint:='';
    // si existen rutas pendientes en la cola
    if frmPrincipal.lbRespaldosCola.Items.Count > 0 then
    begin
      // actualizo la ruta
      ruta:=frmPrincipal.lbRespaldosCola.Items[0];
      frmPrincipal.lbRespaldosCola.Items.Delete(0);
      frmPrincipal.splAvisos.OpenSplitter;
      
      // vuelvo a llamar el hilo
      HiloCorte:=TActCorte.Create(false);
      crtAct:=true;
      {-------------------Borrar los archivos recibidos-------------------}
      {DeleteFile(pChar(ExtractFilePath(Application.ExeName)+res));
      DeleteFile(pChar(ExtractFilePath(Application.ExeName)+temp));
      DeleteFile(pChar(ExtractFilePath(Application.ExeName)+'Corte.z'));
      DeleteFile(pChar(ExtractFilePath(Application.ExeName)+'corte.id'));}
      {-------------------------------------------------------------------}
      frmPrincipal.tiEsthel.ShowBalloonHint('Aviso','Respaldos y Cortes recibidos de la tienda.',bitInfo,10);
    end
    else
      crtAct:=false;
    //-------------------------------------/
  end;
end;
como ven, la variable ruta es la base con la cual el hilo hace su trabajo, entonces al momento de que es procedimiento esta activo, guardo esa ruta por mientras en un listbox y despues de terminar el proceso voy tomando esas rutas nuevamente.
Responder Con Cita
  #2  
Antiguo 14-08-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Vaya problema, no estoy 100% familiarizado con la clase, pero me pregunto; si le pones un Resume funciona? otra cosa... estas en una sección crítica, lo que significa que no entrará al proceso hasta salir, sin embargo FreeOnTerminate := True

El consejo que te podría dar es el siguiente; la forma en que solucionaste el problema esta buena... una cola de rutas; la idea es la siguiente, el hilo hace su trabajo sin terminar hasta que finalice la aplicacion, cuando hay algún dato en la cola, pues lo procesa y lo borra y continua... algo como ésto:

Código Delphi [-]
 repeat Sleep($7F);
  if frmPrincipal.lbRespaldosCola.Count <> 0 then
   begin
    ruta := frmPrincipal.lbRespaldosCola.Items[0];
 
...
 
    frmPrincipal.lbRespaldosCola.Delete(0);
   end;
 until Application.Terminated;

y en el hilo principal lo único que haces en añadir un dato a la cola, el hilo se encargará de procesar cuantos hayan.

Saludos
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
ejecutar consulta sql en hilo pborges36 OOP 0 10-05-2007 19:29:32
Cuando se llama un SP dentro de otro SP autom. se hace rollback por error cuxoapat Firebird e Interbase 1 06-04-2005 23:15:50


La franja horaria es GMT +2. Ahora son las 15:47:51.


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