两个不同的TThread后代如何共享一个OnTerminate处理程序?

Pie*_*Wyk 3 delphi multithreading

我有一个应用程序启动一些线程来做东西.我有一个TThreadOnTerminate程序,每个线程访问一些线程变量,用结果填充网格.(每个线程执行不同的任务,但答案总是相同的,即成功或失败StringList的消息.)

所以我有:

procedure TFormMain.Thread1OnTerminate(Sender: TObject);
begin
  Result := TThread1(Sender).Result;
  AddMessagesToGrid(TThread1(Sender).Messages);
end;

procedure TFormMain.Thread2OnTerminate(Sender: TObject);
begin
  Result := TThread2(Sender).Result;
  AddMessagesToGrid(TThread2(Sender).Messages);
end;
Run Code Online (Sandbox Code Playgroud)

我的问题如下.我可以有一个'通用' OnTerminate程序来处理我所有线程的结果,如下所示?

procedure TFormMain.Thread1OnTerminate(Sender: TObject);
begin
  Result := <Sender Thread>.Result;
  AddMessagesToGrid(<Sender Thread>.Messages);
end;
Run Code Online (Sandbox Code Playgroud)

我们目前正在使用Delphi 2007.很快就升级(我希望)到Delphi XE.

Mar*_*ema 9

是的,如果所有线程都实现相同的接口,则没有理由不返回Result值和消息.

最简单的方法是使用结果和消息创建一个基本线程类,并使所有当前线程成为该基类的后代.

type
  TBaseThread = class(TThread)
  protected
    function GetResult: Integer; {virtual if you want to}
    function GetMessages: TStrings; {virtual if you want to}
  public
    property Result: Integer read GetResult;
    property Messages: TStrings read GetMessages;
Run Code Online (Sandbox Code Playgroud)

然后按如下方式使用它:

procedure TFormMain.Thread1OnTerminate(Sender: TObject);
begin
  Assert(Sender is TBaseThread);
  Result := TBaseThread(Sender).Result;
  AddMessagesToGrid(TBaseThread(Sender).Messages);
end;
Run Code Online (Sandbox Code Playgroud)