FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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); 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; |
#2
|
||||
|
||||
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:
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 |
|
|
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 |
|