La suite VCL "abfcomponents" incorpora un componente llamado TabfThreadComponent que encapsula el objeto tThread que simplifica enormemente la programación con hilos.
Para utilizarlo instalar la suite como se hace habitualmente y arrastrar el componente anterior a vuestro form.
Incorpora 4 eventos: OnException, OnExecute, OnTerminate, OnFinish, pues bien para ejecutar un prodimiento cualquiera en un thread simplemente hay que colocarlo en el evento OnExecute, así de fácil y nos olvidamos de definir el thread y demás historias, ya que eso lo hace el componente por nosotros.
Definición del evento OnExecute:
procedure TForm1.abfThreadComponent1Execute(Sender: TObject);
begin
// incluir aquí la llamada al procedimiento que hayamos definido en nuestra unit
end;
Y para lanzar el hilo teclear:
abfThreadComponent1.Execute;
Dado que no he encontrado mucho código en internet, si mis estimados lectores pueden postear código o indicar alguna web que lo contenga sería de agradecer y muy útil para todos.
Link:
En realidad asi funciona una thread, el codigo completo seria asi:
ResponderEliminar//Tarea que vigila el registro de windows
unit UnitThReadReg;
interface
uses
Windows, Classes, Registry;
type
TTimeEvent = procedure(Sender: TObject) of object;
ThreadReg = class(TThread)
private
{ Private declarations }
maquina: string;
estado: boolean;
resultado: boolean;
primeraVez: boolean;
FOnActivada: TTimeEvent;
FOnDesactivada: TTimeEvent;
protected
procedure Execute; override;
procedure Activada(); dynamic;
procedure Desactivada(); dynamic;
procedure LeerRegistro();
public
constructor Create(omaquina: string);
property OnActivada: TTimeEvent
read FOnActivada write FOnActivada;
property OnDesactivada: TTimeEvent
read FOnDesactivada write FOnDesactivada;
end;
implementation
constructor ThreadReg.Create(omaquina: string);
begin
maquina := omaquina;
primeraVez := False;
resultado := False;
inherited Create(False);
end;
procedure ThreadReg.Execute;
begin
FreeOnTerminate := True;
Priority := TThreadPriority(tpNormal);
LeerRegistro();
end;
procedure ThreadReg.Activada();
begin
if Assigned(FOnActivada) then
FOnActivada(Self);
end;
procedure ThreadReg.Desactivada();
begin
if Assigned(FOnDesactivada) then
FOnDesactivada(Self);
end;
procedure ThreadReg.LeerRegistro();
var
Reg: TRegistry;
begin
while True do
begin
Reg := Tregistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('Software\DatCom\' + maquina, True) then
begin
try
resultado := Reg.ReadBool('Salida Digital');
finally
Reg.CloseKey;
end;
end;
finally
Reg.Free;
end;
if primeraVez = False then
begin
primeraVez := True;
estado := resultado;
end
else
begin
if (resultado = True) and (estado = False) then
Synchronize(Activada);
if (resultado = False) and (estado = True) then
Synchronize(Desactivada);
estado := resultado;
end;
if Terminated then
Break;
SleepEx(100, False);
end;
end;
end.
// Y asi se utiliza
uses
UnitThReadReg
var
ReadReg: array of ThreadReg;
function xxxx();
begin
ReadReg[maquina] := ThreadReg.Create(Lnombre[maquina].Caption);
case maquina of
1: ReadReg[maquina].OnActivada := CadaActivadaSD01;
2: ReadReg[maquina].OnActivada := CadaActivadaSD02;
end;
case maquina of
1: ReadReg[maquina].OnDesactivada := CadaDesactivadaSD01;
2: ReadReg[maquina].OnDesactivada := CadaDesactivadaSD02;
end;
end;
Muchas gracias por el aporte, he probado las FasterThead
ResponderEliminary van muy bien