Nunca ha sido tan fácil utilizar los threads

.
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:



2 comentarios:

  1. En realidad asi funciona una thread, el codigo completo seria asi:

    //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;

    ResponderEliminar
  2. Muchas gracias por el aporte, he probado las FasterThead
    y van muy bien

    ResponderEliminar

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...