两个不同的TThread后代如何共享一个OnTerminate处理程序? [英] How can two different TThread descendants share an OnTerminate handler?

查看:310
本文介绍了两个不同的TThread后代如何共享一个OnTerminate处理程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



所以我有:

 程序TFormMain.Thread1OnTerminate(发件人:TObject); 
begin
结果:= TThread1(Sender).Result;
AddMessagesToGrid(TThread1(Sender).Messages);
结束

procedure TFormMain.Thread2OnTerminate(Sender:TObject);
begin
结果:= TThread2(Sender).Result;
AddMessagesToGrid(TThread2(Sender).Messages);
结束

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

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

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

解决方案

是的,没有理由为什么你不能,只要所有线程实现相同的界面,返回Result值和消息。 / p>

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

  type 
TBaseThread = class(TThread)
protected
function GetResult:Integer; {virtual if you want to}
function GetMessages:TStrings; {virtual if you want to}
public
属性结果:整数读取GetResult;
属性消息:TStrings读取GetMessages;

然后使用如下:

  procedure TFormMain.Thread1OnTerminate(Sender:TObject); 
begin
Assert(发件人是TBaseThread);
结果:= TBaseThread(Sender).Result;
AddMessagesToGrid(TBaseThread(Sender).Messages);
结束


I have an application that launches a number threads to do stuff. I have a TThreadOnTerminate procedure for each of the threads that accesses some thread variables to populate a grid with the results. (Each thread performs a different task but the answer is always the same, ie. Success or Fail with a StringList of messages.)

So I have:

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;

My question is the following. Can I have a 'common' OnTerminate procedure to handle the results of all my threads, as below?

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

We currently use Delphi 2007. Soon to be upgraded (I hope) to Delphi XE.

解决方案

Yes, no reason why you couldn't, provided all threads implement the same interface, to return the Result value and the messages.

The easiest way to do that is to make an base thread class with the result and messages and make all your current threads descendants of that base class.

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;

and then use it as follows:

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

这篇关于两个不同的TThread后代如何共享一个OnTerminate处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆