两个不同的TThread后代如何共享一个OnTerminate处理程序? [英] How can two different TThread descendants share an OnTerminate handler?
问题描述
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屋!