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

Ed.*_*d.C 4 delphi multithreading callback delphi-2010

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

我的猜测是在TThread类中添加一个字段并从中调用它TThread.Execute.

所以线程外的代码将是:

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

如何保持一个参考 @fooTWorkerThread,并从内部调用它Execute

ska*_*adt 6

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


And*_*and 5

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

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;    
Run Code Online (Sandbox Code Playgroud)

然后,如果你有任何程序,比如

procedure P;
begin
  while true do
  begin
    sleep(1000);
    beep;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

你可以做

procedure TForm1.Button1Click(Sender: TObject);
begin
  TWorkerThread.RunInThread(P);
end;
Run Code Online (Sandbox Code Playgroud)

你甚至可以做

TWorkerThread.RunInThread(procedure begin while true do begin sleep(1000); beep; end; end);
Run Code Online (Sandbox Code Playgroud)

  • Ed,如果您必须将`@` 放在过程名称前面,这通常表明过程指针类型与您尝试传递给它的过程不匹配。确保签名完全匹配;不要尝试在需要过程的地方传递函数,反之亦然。@XBasic,是的,您可以添加任何您想要的参数。只需确保将它们添加到类型声明中:`TProcRef = reference to procedure(AValue: string; AValue2: Integer)` (2认同)