Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Пример работы с потоками

Delphi , Компоненты и Классы , Потоки



Автор: Xavier Pacheco

unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Menus, Dialogs;

type
  TMainForm = class(TForm)
    MainMenu1: TMainMenu;
    Options1: TMenuItem;
    AddThread: TMenuItem;
    RemoveThread: TMenuItem;
    ColorDialog1: TColorDialog;
    Add10: TMenuItem;
    RemoveAll: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure AddThreadClick(Sender: TObject);
    procedure RemoveThreadClick(Sender: TObject);
    procedure Add10Click(Sender: TObject);
    procedure RemoveAllClick(Sender: TObject);
  private
    ThreadList: TList;
  public
    { Public declarations }
  end;

  TDrawThread = class(TThread)
  private
    FColor: TColor;
    FForm: TForm;
  public
    constructor Create(AForm: TForm; AColor: TColor);
    procedure Execute; override;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

{ TDrawThread }

constructor TDrawThread.Create(AForm: TForm; AColor: TColor);
begin
  FColor := AColor;
  FForm := AForm;
  inherited Create(False);
end;

procedure TDrawThread.Execute;
var
  P1, P2: TPoint;

  procedure GetRandCoords;
  var
    MaxX, MaxY: Integer;
  begin
    // initialize P1 and P2 to random points within Form bounds
    MaxX := FForm.ClientWidth;
    MaxY := FForm.ClientHeight;
    P1.x := Random(MaxX);
    P2.x := Random(MaxX);
    P1.y := Random(MaxY);
    P2.y := Random(MaxY);
  end;

begin
  FreeOnTerminate := True;
  // thread runs until it or the application is terminated
  while not (Terminated or Application.Terminated) do
  begin
    GetRandCoords; // initialize P1 and P2
    with FForm.Canvas do
    begin
      Lock; // lock canvas
      // only one thread at a time can execute the following code:
      Pen.Color := FColor; // set pen color
      MoveTo(P1.X, P1.Y); // move to canvas position P1
      LineTo(P2.X, P2.Y); // draw a line to position P2
      // after the next line executes, another thread will be allowed
      // to enter the above code block
      Unlock; // unlock canvas
    end;
  end;
end;

{ TMainForm }

procedure TMainForm.FormCreate(Sender: TObject);
begin
  ThreadList := TList.Create;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  RemoveAllClick(nil);
  ThreadList.Free;
end;

procedure TMainForm.AddThreadClick(Sender: TObject);
begin
  // add a new thread to the list... allow user to choose color
  if ColorDialog1.Execute then
    ThreadList.Add(TDrawThread.Create(Self, ColorDialog1.Color));
end;

procedure TMainForm.RemoveThreadClick(Sender: TObject);
begin
  // terminate the last thread in the list and remove it from list
  TDrawThread(ThreadList[ThreadList.Count - 1]).Terminate;
  ThreadList.Delete(ThreadList.Count - 1);
end;

procedure TMainForm.Add10Click(Sender: TObject);
var
  i: Integer;
begin
  // create 10 threads, each with a random color
  for i := 1 to 10 do
    ThreadList.Add(TDrawThread.Create(Self, Random(MaxInt)));
end;

procedure TMainForm.RemoveAllClick(Sender: TObject);
var
  i: Integer;
begin
  Cursor := crHourGlass;
  try
    for i := ThreadList.Count - 1 downto 0 do
    begin
      TDrawThread(ThreadList[i]).Terminate; // terminate thread
      TDrawThread(ThreadList[i]).WaitFor; // make sure thread terminates
    end;
    ThreadList.Clear;
  finally
    Cursor := crDefault;
  end;
end;

initialization
  Randomize; // seed random number generator
end.

Пример многопоточного приложения, написанного на языке Delphi, популярном для создания оконных приложений под Windows.

Приложение предназначено для демонстрации использования потоков в графическом пользовательском интерфейсе (GUI). Основная форма имеет несколько пунктов меню, позволяющих пользователю создавать новые потоки, удалять существующие потоки, добавлять несколько потоков одновременно и удалить все потоки.

Вот обзор работы кода:

  1. Класс TMainForm - основная форма приложения, содержит список потоков (ThreadList) и несколько пунктов меню.
  2. Когда пользователь кликнет на пункт меню "Добавить поток", создается новый поток с помощью класса TDrawThread, с случайным цветом, выбранным пользователем через диалоговое окно цвета.
  3. Класс TDrawThread - отвечает за рисование линий на канвасе основной формы в цикле до тех пор, пока поток или приложение не будет остановлено. Каждый поток работает параллельно с другими потоками, позволяя одновременно рисовать несколько линий.
  4. Когда пользователь кликнет на пункт меню "Удалить поток", последний поток в списке будет остановлен и удален из списка.
  5. Когда пользователь кликнет на пункт меню "Добавить 10 потоков", создается 10 новых потоков, каждый с случайным цветом.
  6. Когда пользователь кликнет на пункт меню "Удалить все потоки", все потоки в списке будут остановлены и удалены из списка.

Класс TDrawThread использует класс TThread как базовый класс, который обеспечивает поддержку многопоточности в Delphi. Метод Execute класса TDrawThread переопределен для реализации логики потока, которая заключается в рисовании линий на канвасе основной формы и остановке приложения или потока.

Код использует несколько техник для обеспечения безопасности потоков, таких как блокировка канваса основной формы перед рисованием на нем и разблокировка после него. Это предотвращает доступ нескольких потоков к одним ресурсам одновременно, что могло бы привести к конфликтам и ошибкам.

В целом, это пример демонстрации использования многопоточности в GUI-приложении для улучшения отзывчивости и производительности за счет выполнения задач параллельно.

В статье описывается пример работы с потоками в Delphi, где создается форма для управления потоками и рисования линий на ней.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:38:17/0.0033750534057617/0