1
0
mirror of https://github.com/loginov-dmitry/multithread.git synced 2024-11-25 00:56:17 +02:00
multithread/Ex3/Ex3Unit.pas

107 lines
2.9 KiB
ObjectPascal
Raw Normal View History

2024-10-12 21:56:05 +02:00
{$IFDEF FPC}{$CODEPAGE UTF8}{$H+}{$MODE DELPHI}{$ENDIF}
unit Ex3Unit;
interface
uses
2024-10-12 21:56:05 +02:00
{$IFnDEF FPC}
Windows, Messages, ProgressViewer,
{$ELSE}
LCLIntf, LCLType, LMessages,
{$ENDIF}
SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TMyShortThread = class(TThread)
private
2024-10-12 21:56:05 +02:00
FStatus: string;
procedure DoUsefullTask; // Процедура для имитации полезной работы
2024-10-12 21:56:05 +02:00
procedure UpdateGui;
procedure SetThreadStatus(AStatus: string);
public
procedure Execute; override;
end;
TForm1 = class(TForm)
btnRunParallelThread: TButton;
2024-10-12 21:56:05 +02:00
labStatus: TLabel;
procedure btnRunParallelThreadClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
MyThread: TMyShortThread;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
2024-10-12 21:56:05 +02:00
{$IFnDEF FPC}
{$R *.dfm}
{$ELSE}
{$R *.lfm}
{$ENDIF}
procedure TForm1.btnRunParallelThreadClick(Sender: TObject);
begin
// Запускает параллельный поток. Если объект потока уже создан,
// то уничтожает его.
if MyThread <> nil then
FreeAndNil(MyThread);
MyThread := TMyShortThread.Create(False);
end;
{ TMyShortThread }
2024-10-12 21:56:05 +02:00
{$IFnDEF FPC}
procedure TMyShortThread.DoUsefullTask;
var
AProgress: TProgressViewer;
begin
// Реальный поток может выполнять какую угодно полезную работу
// В учебных целях делаем паузу 5 секунд для имитации задержки, которая
// может возникнуть при выполнении полезной работы
AProgress := TProgressViewer.Create('Выполняется поток TMyShortThread');
Sleep(5000);
AProgress.TerminateProgress;
end;
2024-10-12 21:56:05 +02:00
{$ELSE FPC}
// Вариант метода DoUsefullTask для Лазаруса (модуль ProgressViewer для Лазаруса отсутствует)
procedure TMyShortThread.DoUsefullTask;
begin
SetThreadStatus('Выполняется поток TMyShortThread...');
Sleep(5000);
SetThreadStatus('');
end;
{$ENDIF FPC}
procedure TMyShortThread.Execute;
begin
DoUsefullTask;
end;
2024-10-12 21:56:05 +02:00
procedure TMyShortThread.SetThreadStatus(AStatus: string);
begin
FStatus := AStatus;
UpdateGui;
end;
procedure TMyShortThread.UpdateGui;
begin
Form1.labStatus.Visible := FStatus <> '';
Form1.labStatus.Caption := FStatus;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// При закрытии программы необходимо завершить работу потока
// и уничтожить объект потока MyThread
if MyThread <> nil then
MyThread.Free;
end;
end.