从Delphi中的函数指针调用函数

时间:2010-10-21 21:38:16

标签: multithreading delphi callback delphi-2010

我正在尝试在Delphi中构建一个通用工作线程,我可以将一个函数/过程(无关紧要)作为参数传递并让它执行。

我的猜测是在TThread课程中添加一个字段,然后从TThread.Execute调用该字段。

所以线程之外的代码将是:

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

如何在@foo中保留TWorkerThread的引用,并在Execute内调用它?

3 个答案:

答案 0 :(得分:6)

此外,使用通用线程的良好开端是AsyncCallsOmni Thread Library

答案 1 :(得分:4)

我不假装自己是线程专家,但我认为这样做会:

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);

答案 2 :(得分:4)

查看QueueUserWorkItem功能。

它在线程中执行任意函数,而不需要您创建一个。 只是不要忘记将IsMultithreaded全局变量切换为True。