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.