我在使用Delphi Rio。 我已經創建了一個執行緒類。
type
TThreadManager = class(TThread)
constructor Create;
end。
constructor TThreadManager.Create; Create?
begin
inherited Create(True); // thread-ul va fi creat, dar nu va rula
// pentru a-l rula, folosim "Resume" (su "Execute")
FreeOnTerminate := True; // thread-ul va fi distrus automat cand termina。
Priority := tpNormal; // prioritatea thread-ului este minima[/span
<- 在這里創建內部物件
fIsSetupOk := False;
end;
然而,當我在應用程式中創建執行緒時,(這個)建構式沒有被使用。沒有除錯斷點可用。而且也沒有創建任何物件。
threadManager := TThreadManager.Create;
threadManager.Setup(dmMain.ibSessionMain)。
threadManager.Resume。
由于沒有進入這個建構式,在訪問物件時引發了一個AV。
有什么提示嗎?
當然,我可以在其他地方創建物件(進入設定),但這并不是我想要的。
uj5u.com熱心網友回復:
TThread有自己的無引數的Create()建構式。你應該把你的宣告為reintroduce來隱藏現有的建構式,例如:
type
TThreadManager = class(TThread)
public(TThread)
constructor Create; reintroduce;
end。
一個更好的選擇是在Create()內部呼叫Setup(),并設定CreateSuspended=False。這樣一來,在呼叫哪個建構式上就不會有歧義,執行緒將在Setup()完成后自動開始運行,例如:
span class="hljs-keyword">type
TThreadManager = class(TThread)
public(TThread)
constructor Create(Session: TIB_Session); reintroduce。
end;
constructor TThreadManager.Create(Session: TIB_Session);
begin
inherited Create(False);
FreeOnTerminate := True。
Priority := tpNormal;
<- 在這里創建內部物件
fIsSetupOk := False;
設定(Session)。
結束。
threadManager := TThreadManager.Create(dmMain.ibSessionMain)。
另外,你可以將你的建構式重命名為更有意義的東西,例如:
type
TThreadManager = class(TThread)
public(TThread)
constructor CreateAndSetup(Session: TIB_Session);
end。
constructor TThreadManager.CreateAndSetup(Session: TIB_Session);
begin
inherited Create(False);
FreeOnTerminate := True。
Priority := tpNormal;
<- 在這里創建內部物件
fIsSetupOk := False;
設定(Session)。
結束。
threadManager := TThreadManager.CreateAndSetup(dmMain.ibSessionMain)。
uj5u.com熱心網友回復:
在我使用了remy的建議2后,我發現了我的代碼中的問題。 在按照建議創建方法(添加TIB_SESSION作為引數)后,我發現該方法無法使用,因為它被宣告在protected部分而不是public。 把它放到正確的部分后,一切都好了。 非常感謝
。轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/316482.html
標籤:
