IgorPI
@IgorPI

Delphi Async Callable?

Коллеги, приветствую.

Интересует вопрос, вызова асинхронных функций в Delphi.

На первом этапе создал следующий юнит

unit TD.AsyncFunc;

interface
 uses
  System.classes;

type
   TAsyncCallProc = reference to procedure;

type
 TAsyncFuncThread = class(TThread)
 private
    Fproc: TAsyncCallProc;
   { private declarations }
 protected
    procedure Execute; override;
 public
   constructor Create(const proc: TAsyncCallProc);


 published
   { published declarations }
 end;


procedure AsyncCallProc(const proc: TAsyncCallProc);

implementation

procedure AsyncCallProc(const proc: TAsyncCallProc);
var
 th: TAsyncFuncThread;
begin
 th:= TAsyncFuncThread.Create(proc)
end;

{ TAsyncFuncThread }

constructor TAsyncFuncThread.Create(const proc: TAsyncCallProc);
begin
  Fproc := proc;
  FreeOnTerminate := true;
  inherited Create(false);
end;

procedure TAsyncFuncThread.Execute;
begin
  Fproc;
end;

end.


Та тут и коню понятно, что этот способ не потоко-безопасный

Использовать так:

procedure TMainForm.Button3Click(Sender: TObject);
begin

  AsyncCallProc(
    procedure
    begin
      (Sender as TButton).Text := 'Начал выполнение';
      Sleep(5000);
      (Sender as TButton).Text := 'Закончил выполнение';
    end);

end;


5d4b4c3f41b19575224286.gif
  • Вопрос задан
  • 139 просмотров
Решения вопроса 2
@zedxxx
А в чём, собственно, вопрос? Чтобы сделать код потокобезопасным, обращение к гую надо завернуть в Synchronize метод (вызов Sleep, естественно, заворачивать не надо).
Вот туториал про использование TTask и синхронизацию: Using Tasks from the Parallel Programming Library
Ответ написан
HemulGM
@HemulGM Куратор тега Delphi
Delphi Developer, сис. админ
Если хочешь синхронизировать потоки из метода, то используй
TThread.Synchronize(<method>);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы