Ver Mensaje Individual
  #5  
Antiguo 03-07-2020
ludan508 ludan508 is offline
Miembro
 
Registrado: ago 2004
Posts: 17
Reputación: 0
ludan508 Va por buen camino
Threads para Timbrar Documentos

Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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;

{ TTimbrado }

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); // <-- Sistema:    0 = AdminPAQ    1 = CONTPAQ i® Factura Electrónica

                            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;
__________________
Atte.

«° ßåRôµ Dâµµ¥-Bõ¥ °»
v. 2007
Responder Con Cita