Cita:
Empezado por Neftali [Germán.Estévez]
Vale. La cosa está un poco más clara...
Haces el Create con el parámetro a False, por lo tanto el thread se inicia automáticamente después de crearlo.
En ese momento se ejecuta el método Execute, que por lo que veo no hace nada (lo tienes vacío).
Ahí acabó la ejecución de tu hilo.
En ese momento llamas al Terminate ¿Para qué?
Luego lo que haces es ejecutar un método de tu clase ( pTimbrado a través de la propiedad) que se ejecuta como cualquier otro método de cualquier otra clase, es decir, en el hilo principal de la aplicación.
=> Por eso tu ejecución es secuencial. Has creado una clase que deriva de TThread y no la usas.
Creo que tienes un error de concepto con los Threads. Revisa esto:
http://docwiki.embarcadero.com/Libra...TThread.Create
O en mi blog tienes algunos ejemplos sencillos que te ayudarán a entender cómo funcionan.
https://neftali.clubdelphi.com/ejemp...-sin-utilidad/
https://neftali.clubdelphi.com/ejemp...-ampliado-v-2/
https://neftali.clubdelphi.com/pendi...nd-tcontext3d/
Resumiendo mucho...
(1) Meter muchas cosas dentro de una clase que derive de TThread no significa que estés utilizando Threads.
(2) El método básico de la clase TThead es el método Execute. Lo que pongas ahí es lo que se ejecuta en un thread diferente al principal de la aplicación (en tu clase está vacío)
(3) Importantes además de Execute, son el Terminate y el Synchronize.
No se si me he explicado...
|
*****************************************************************************************
Buen día, definitivamente soy nuevo en esto de los Threads, realice estas modificaciones, y ya no hace nada
Revise tus códigos y veo que usas el Create y Synchonize y me siento muy confundido, como puedo realizar el llamada pTimbrado dentro del hilo.
Código Delphi
[-]
type
TTimbrado = class(TThread)
protected
procedure Execute; override;
procedure pTimbrado;
public
wXMLxTimbrar: WideString;
wXMLTimbrado: WideString;
constructor Create(wXMLPendiente: WideString);
end;
constructor TTimbrado.Create(wXMLPendiente: WideString);
begin
inherited Create(False);
wXMLxTimbrar := wXMLPendiente;
end;
procedure TTimbrado.Execute;
begin
FreeOnTerminate := True;
Synchronize(pTimbrado);
end;
procedure TTimbrado.pTimbrado;
var wResult: WideString;
lError: Longint;
lUUID: Array[0..255] of Char;
sRFC: String;
sRutaSave: String;
bEsPago: Boolean;
begin
inherited;
FreeOnTerminate := True;
wResult := '';
sRutaSave := EmptyStr;
bEsPago := False;
if (Pos('Pago', wXMLxTimbrar) > 0) then
bEsPago := True;
sRFC := fExtraeRFC(wXMLxTimbrar);
if sRFC <> EmptyStr then
begin
xRutaXML := wXMLxTimbrar;
xRutaTimbre := StringReplace(wXMLxTimbrar, 'CFDI_Pendientes', 'CFDI_Timbrados', [rfReplaceAll]);
xRutaTimbre := TrimLeft(TrimRight(xRutaTimbre));
if not fAbreArchivoRutas(sRFC) then
wResult := 'No se encuentra el archivo sRutaContpaq'
else
begin
try
lError := fInicializaSDK();
if lError <> 0 then
wResult := PChar(fMensajeError(lError))
else
begin
lError := fSetNombrePAQ(PChar(kFACTURACION_I));
if lError <> 0 then
begin
fTerminaSDK();
wResult := PChar(fMensajeError(lError))
end
else
begin
lError := fAbreEmpresa(PChar(sRutaEmpresa));
if lError <> 0 then
begin
fTerminaSDK();
wResult := PChar(fMensajeError(lError))
end
else
begin
lError := fInicializaLicenseInfo(1);
if lError <> 0 then
begin
fTerminaSDK();
wResult := PChar(fMensajeError(lError))
end
else
begin
try
if not bEsPago then
begin
lError := fTimbraXML(PChar(xRutaXML),
'5',
lUUID,
'',
PChar(sRutaXMLSave),
PChar(sPasswd),
PChar('c:\compacw\empresas\reportes\factiracopm\plantilla_factura_cfdi_1.htm'));
end
else
begin
lError := fTimbraComplementoPagoXML(PChar(xRutaXML),
'5',
lUUID,
'',
PChar(sRutaXMLSave),
PChar(sPasswd),
PChar('c:\compacw\empresas\reportes\factiracopm\Plantilla_REP_1.htm'));
end;
if lError <> 0 then
wResult := PChar(fMensajeError(lError))
else
begin
sRutaSave := xRutaTimbre;
try
if FileExists(sRutaXMLSave + lUUID + '.xml') then
CopyFile(PChar(sRutaXMLSave + lUUID + '.xml'), PChar(sRutaSave), True);
except
on e: Exception do
begin
wResult := e.Message;
end;
end;
fCierraEmpresa();
fTerminaSDK();
wResult := '';
end;
except
on e: Exception do
begin
wResult := e.Message;
fCierraEmpresa();
fTerminaSDK();
end;
end;
end;
end;
end;
end;
except
on e: Exception do
begin
fCierraEmpresa();
fTerminaSDK();
wResult := e.Message;
end;
end;
end;
end
else
wResult := 'El XML por Timbrar no existe';
wXMLTimbrado := wResult;
end;
y así lo llamo
Código Delphi
[-]
CoInitialize(nil);
TimbradoXML := TTimbrado.Create(wRuta);
wResultado := TimbradoXML.wXMLTimbrado;