Introducción

En este módulo, exploraremos el concepto de multihilo y programación paralela en Delphi. La capacidad de ejecutar múltiples hilos de ejecución simultáneamente puede mejorar significativamente el rendimiento de las aplicaciones, especialmente en sistemas con múltiples núcleos de CPU. Aprenderemos cómo crear y gestionar hilos en Delphi, así como técnicas para sincronizar y comunicar entre hilos.

Conceptos Clave

  1. Hilo (Thread): Un hilo es la unidad más pequeña de procesamiento que puede ser gestionada de manera independiente por un sistema operativo.
  2. Multihilo (Multithreading): La capacidad de un programa para ejecutar múltiples hilos simultáneamente.
  3. Programación Paralela: Técnica de programación que permite la ejecución de operaciones simultáneas para mejorar el rendimiento.
  4. Sincronización: Mecanismos para coordinar la ejecución de hilos y evitar condiciones de carrera.

Creación de Hilos en Delphi

Clase TThread

En Delphi, la clase TThread proporciona una manera sencilla de crear y gestionar hilos. A continuación, se muestra un ejemplo básico de cómo crear un hilo en Delphi.

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TMyThread.Execute;
begin
  // Código que se ejecutará en el hilo
  while not Terminated do
  begin
    // Realizar alguna tarea
    Sleep(1000); // Simular trabajo
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyThread: TMyThread;
begin
  MyThread := TMyThread.Create(True); // Crear el hilo suspendido
  MyThread.FreeOnTerminate := True;   // Liberar automáticamente al finalizar
  MyThread.Start;                     // Iniciar el hilo
end;

Explicación del Código

  • Definición de la Clase TMyThread: Se define una clase TMyThread que hereda de TThread. El método Execute se sobrescribe para definir el código que se ejecutará en el hilo.
  • Método Execute: Contiene un bucle que se ejecuta mientras el hilo no esté terminado (Terminated). Dentro del bucle, se puede colocar el código que realiza la tarea deseada.
  • Creación e Inicio del Hilo: En el evento Button1Click, se crea una instancia de TMyThread y se inicia el hilo con el método Start.

Sincronización de Hilos

Uso de TEvent

Para sincronizar hilos, Delphi proporciona varias clases, como TEvent, TCriticalSection, y TMonitor. A continuación, se muestra un ejemplo de uso de TEvent para sincronizar hilos.

var
  Event: TEvent;

type
  TWorkerThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TWorkerThread.Execute;
begin
  while not Terminated do
  begin
    Event.WaitFor(INFINITE); // Esperar hasta que se señale el evento
    // Realizar alguna tarea
    Sleep(1000); // Simular trabajo
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Event.SetEvent; // Señalar el evento para despertar el hilo
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Event := TEvent.Create(nil, True, False, '');
  TWorkerThread.Create(False); // Crear y ejecutar el hilo
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Event.Free;
end;

Explicación del Código

  • Creación del Evento: En el evento FormCreate, se crea una instancia de TEvent.
  • Uso del Evento en el Hilo: En el método Execute del hilo, se llama a Event.WaitFor para esperar hasta que el evento sea señalado.
  • Señalización del Evento: En el evento Button2Click, se llama a Event.SetEvent para señalar el evento y despertar el hilo.

Ejercicio Práctico

Ejercicio 1: Crear un Hilo que Imprima Números

Objetivo: Crear un hilo que imprima números del 1 al 10 en la consola.

Instrucciones:

  1. Definir una clase que herede de TThread.
  2. Sobrescribir el método Execute para imprimir números del 1 al 10.
  3. Crear e iniciar el hilo desde un botón en un formulario.

Solución:

type
  TNumberThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TNumberThread.Execute;
var
  i: Integer;
begin
  for i := 1 to 10 do
  begin
    WriteLn(i);
    Sleep(500); // Pausa de medio segundo entre números
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  TNumberThread.Create(False); // Crear y ejecutar el hilo
end;

Ejercicio 2: Sincronizar Dos Hilos

Objetivo: Crear dos hilos que se alternen para imprimir mensajes en la consola.

Instrucciones:

  1. Definir dos clases de hilos que hereden de TThread.
  2. Utilizar TEvent para sincronizar la ejecución de los hilos.
  3. Crear e iniciar ambos hilos desde un botón en un formulario.

Solución:

var
  Event1, Event2: TEvent;

type
  TThread1 = class(TThread)
  protected
    procedure Execute; override;
  end;

  TThread2 = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TThread1.Execute;
begin
  while not Terminated do
  begin
    Event1.WaitFor(INFINITE);
    WriteLn('Hilo 1');
    Event1.ResetEvent;
    Event2.SetEvent;
  end;
end;

procedure TThread2.Execute;
begin
  while not Terminated do
  begin
    Event2.WaitFor(INFINITE);
    WriteLn('Hilo 2');
    Event2.ResetEvent;
    Event1.SetEvent;
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Event1 := TEvent.Create(nil, True, False, '');
  Event2 := TEvent.Create(nil, True, False, '');
  TThread1.Create(False);
  TThread2.Create(False);
  Event1.SetEvent; // Iniciar el primer hilo
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Event1.Free;
  Event2.Free;
end;

Conclusión

En este módulo, hemos aprendido los conceptos básicos de multihilo y programación paralela en Delphi. Hemos visto cómo crear y gestionar hilos utilizando la clase TThread, así como técnicas para sincronizar hilos utilizando TEvent. Estos conocimientos son fundamentales para desarrollar aplicaciones eficientes y de alto rendimiento en Delphi.

En el próximo módulo, exploraremos el desarrollo basado en componentes, donde aprenderemos a crear y utilizar componentes personalizados en Delphi.

Curso de Programación en Delphi/Object Pascal

Módulo 1: Introducción a Delphi/Object Pascal

Módulo 2: Estructuras de Control y Procedimientos

Módulo 3: Trabajando con Datos

Módulo 4: Programación Orientada a Objetos

Módulo 5: Características Avanzadas de Delphi

Módulo 6: Desarrollo de GUI con VCL y FMX

Módulo 7: Desarrollo Web y Móvil

Módulo 8: Mejores Prácticas y Patrones de Diseño

Módulo 9: Proyecto Final

© Copyright 2024. Todos los derechos reservados