Вызов функции из указателя функции в Delphi - PullRequest
4 голосов
/ 22 октября 2010

Я пытаюсь создать общий рабочий поток в Delphi, в котором я могу передать функцию / процедуру (не имеет значения) в качестве аргумента и позволить ей выполнить.

Я предполагаю добавить поле в классе TThread и вызвать его из TThread.Execute.

Так что код вне потока будет:

  MyThread := TWorkerThread.Create(True);
  Mythread.CallBackF := @Foo;
  try
    MyThread.Resume;
  except
    MyThread.Free;
  end;

Как сохранить ссылку на @foo в TWorkerThread и вызвать ее изнутри Execute?

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

Кроме того, хорошим началом использования общих потоков будет AsyncCalls или Библиотека потоков Omni .

4 голосов
/ 22 октября 2010

Посмотрите на функцию QueueUserWorkItem .

Выполняет произвольную функцию в потоке, не требуя ее создания. Только не забудьте переключить глобальную переменную IsMultithreaded в True.

4 голосов
/ 22 октября 2010

Я не претендую на звание эксперта по многопоточности, но я думаю, что это сработает:

interface

    type
      TProcRef = reference to procedure;
      TWorkerThread = class(TThread)
      public
        proc: TProcRef;
        procedure Execute; override;
        class procedure RunInThread(AProc: TProcRef);
      end;

implementation

procedure TWorkerThread.Execute;
begin
  inherited;
  proc;
end;

class procedure TWorkerThread.RunInThread(AProc: TProcRef);
begin
  with TWorkerThread.Create(true) do
  begin
    FreeOnTerminate := true;
    proc := AProc;
    Resume;
  end;
end;    

Тогда, если у вас есть какая-либо процедура, например

procedure P;
begin
  while true do
  begin
    sleep(1000);
    beep;
  end;
end;

, выможно просто сделать

procedure TForm1.Button1Click(Sender: TObject);
begin
  TWorkerThread.RunInThread(P);
end;

можно даже сделать

TWorkerThread.RunInThread(procedure begin while true do begin sleep(1000); beep; end; end);
...