說我有一個對象,在我的情況下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)。 –