Cita:
Empezado por ludan508
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.
|
Lo primero que debes intentar es colocar el código del timbrado dentro del
Execute, o hacer la llamada al procedimiento de timbrado dentro de él.
Por otro lado el
Synchonize es para sincronizar partes de tu hilo con el hilo prinpical, así que cuando usas el
Synchonize, el código que lo utilize pasa a ejecutarse en el hilo prinicipal.
Para que me entiendas y simplificando mucho:
- Lo que hay en Execute se ejecuta en un hilo diferente al principal (lo que quieres).
- Cuando hay algo que no se puede usar dentro de un hilo porque no es "thread-safe" (por ejemplo acceso a componentes visuales) hay que usar Synchonize. Por eso si TODO lo que hay en el Execute lo llamas con Synchonize, le estás diciendo que TODO lo ejecute en el hilo principal.
Tal como o tienes ahora, quita el método
Synchonize y has la llamada directamente a pTimbrado:
Código Delphi
[-]
procedure TTimbrado.Execute;
begin
FreeOnTerminate := True;
pTimbrado;
end;
Ahora:
(a) Si todo lo que tienes dentro del procedimiento es "Thread-safe", debería funcionar correctamente.
(b) Si hay alguna parte que no es "thread-safe" dentro del procedimiento
pTimbrado, esa parte es la que deberás extraer un un segundo procedimiento y llamarla con un
Synchonize.
Por ejemplo (sólo para que lo entiendas), imaginemos que estas 2 líneas no fueran "thread-safe":
Código Delphi
[-]
if FileExists(sRutaXMLSave + lUUID + '.xml') then
CopyFile(PChar(sRutaXMLSave + lUUID + '.xml'), PChar(sRutaSave), True);
Pues las pasarías a un procedimiento:
Código Delphi
[-]
procedure CopiarFichero();
begin
if FileExists(sRutaXMLSave + lUUID + '.xml') then
CopyFile(PChar(sRutaXMLSave + lUUID + '.xml'), PChar(sRutaSave), True);
end;
Y en su lugar pondrías:
Código Delphi
[-]
...
try
Synchonize(CopiarFichero)
except on e: Exception do
begin
wResult := e.Message;
end;
end;
...
Al realizar el
Execute, se ejecutaría todo lo que hay dentro en un thread diferente en paralelo con el hilo principal de la aplicación, al llegar al punto del
CopiarFichero, se para el thread y el
CopiarFichero se ejecuta en el thread principal (por lo tanto en ese punto no hay paralelismo) y seguidamente el resto del código se vuelve a ejecutar en el Thread en paralelo con el principal.
En resumen, el código del thread debe estar dento del
Execute y las llamadas con
Synchonize deben ser las mínimas posibles y lo más pequeñas posibles dentro del Thread cuando necesitamos que algo que no es "thread-safe" y se ejecute en el hilo principal(por ejemplo como he dicho cuando mosificamos controles visuales).