说我有一个对象,在我的情况下TThread,我想检查它的动态属性之一,在这种情况下,TThread.Terminated。如何将动态属性作为参数传递给函数?
是否有一种干净的方式来传递“属性”,使得我实际上传递了getter函数,并且可以为此动态检查该属性的值?
更多细节:
我的具体问题是,我在Delphi中实现线程的第一次。我并不喜欢标准的Delphi线程实现似乎是为了创建一个自定义的线程类来执行你想要线程化的方法。我发现了一个令人满意的解决方案,它使用委托来定义要执行的方法,然后在创建时将实际的方法传递给线程对象,从而更好地分离/封装线程代码以及由线。下面的细节。
但是,我发现上述想法的实现使用TThread.Suspend来允许提前终止正在执行的方法。 Delphi文档将TThread.Suspend标记为不推荐,并且建议长时间运行的方法应检查Terminated属性,以便在父线程请求时允许提前终止。因此,我需要一种方法将TThread.Terminated引用传递给正在执行的方法,以便该方法可以实现它自己的提前终止。
我无法使用var语法通过引用传递属性。 我无法通过引用传递底层FTerminated字段,因为它是TThread的私有成员。 我知道我只需将TThread对象的引用传递给该方法,但该类型的循环引用看起来像是解决问题的一种方法。
那么,有没有'接受'的方式来动态传递一个属性,或者我坚持我目前的方法?
目前代码: 接口
uses
Windows, Messages, Classes, Forms;
type
// Method Thread Will Execute. Acts on Data. Runs in RunningThread.
// (Reference to RunningThread is past so method can check runningthread.terminated
// to allow long running methods to terminate early when parent thread requests it)
TThreadMethod = procedure (Data: pointer; RunningThread: TThread) of object;
//A Simple Thread Which Excecutes a Method on Some Data
TSimpleThread = class(TThread)
protected
Method: TThreadMethod;
Data: pointer;
procedure Execute; override;
public
constructor Create(Method: TThreadMethod; Data: pointer; CreateSuspended: boolean); overload;
end;
implementation
// SimpleThread
constructor TSimpleThread.Create(Method: TThreadMethod;
Data: pointer;
CreateSuspended: boolean);
begin
Self.Method := Method;
Self.Data := Data;
inherited Create(CreateSuspended);
Self.FreeOnTerminate := True;
end;
procedure TSimpleThread.Execute();
begin
Self.Method(Data, Self);
end;
有你的线程类实现一个你传入你的线程执行方法的接口。 –
- *“我不能通过引用传递底层FTerminated字段,因为它是TThread的私有成员。”* - 不是我推荐的,但是,您可以像getter只读字段。请参阅[本文]下的讨论(http://stackoverflow.com/questions/25666626/delphi-change-main-form-while-application-is-running)。 –