gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:42:33 28 4
gpt4 key购买 nike

我有一个应用程序,可以启动多个线程来执行任务。我为每个线程都有一个 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;

我的问题如下。我可以有一个“通用”OnTerminate 过程来处理所有线程的结果,如下所示?

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

我们目前使用 Delphi 2007。很快就会升级(我希望)到 Delphi XE。

最佳答案

是的,只要所有线程都实现相同的接口(interface),您就没有理由不能返回结果值和消息。

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

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;

然后按如下方式使用它:

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

关于multithreading - 两个不同的 TThread 后代如何共享 OnTerminate 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4875200/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com