创建TThread不进入我的Create()方法
Creating TThread does not enter my Create() method
我正在使用 Delphi Rio。我创建了一个线程 class.
type
TThreadManager = class(TThread)
constructor Create;
end;
constructor TThreadManager.Create;
begin
inherited Create(True); // thread-ul va fi creat, dar nu va rula
// pentru a-l rula, folosim "Resume" (sau "Execute")
FreeOnTerminate := True; // thread-ul va fi distrus automat cand termina
Priority := tpNormal; // prioritatea thread-ului este minima
<- creating internal objects here
fIsSetupOk := False;
end;
但是,当我在应用程序中创建线程时,没有使用(这个)构造函数。没有可用的调试断点。也没有创建任何对象。
threadManager := TThreadManager.Create;
threadManager.Setup(dmMain.ibSessionMain);
threadManager.Resume;
因为没有进入这个构造函数,所以在访问对象时会引发AV。
有什么提示吗?
当然,我可以在别处(在设置中)创建对象,但这不是我想要的。
TThread
有自己的无参数 Create()
构造函数。您应该将您的声明为 reintroduce
以隐藏现有的,例如:
type
TThreadManager = class(TThread)
public
constructor Create; reintroduce;
end;
更好的选择是在 Create()
内部调用 Setup()
,然后设置 CreateSuspended=False
。这样,调用哪个构造函数就不会产生歧义,线程会在Setup()
完成后自动启动运行,eg:
type
TThreadManager = class(TThread)
public
constructor Create(Session: TIB_Session); reintroduce;
end;
constructor TThreadManager.Create(Session: TIB_Session);
begin
inherited Create(False);
FreeOnTerminate := True;
Priority := tpNormal;
<- creating internal objects here
fIsSetupOk := False;
Setup(Session);
end;
threadManager := TThreadManager.Create(dmMain.ibSessionMain);
或者,您可以将构造函数重命名为更有意义的名称,例如:
type
TThreadManager = class(TThread)
public
constructor CreateAndSetup(Session: TIB_Session);
end;
constructor TThreadManager.CreateAndSetup(Session: TIB_Session);
begin
inherited Create(False);
FreeOnTerminate := True;
Priority := tpNormal;
<- creating internal objects here
fIsSetupOk := False;
Setup(Session);
end;
threadManager := TThreadManager.CreateAndSetup(dmMain.ibSessionMain);
在我使用 remy 的建议 2 后,我在 我的代码 中发现了问题。
按照建议创建方法后(添加 TIB_SESSION 作为参数)我发现该方法不可用,因为在 protected 部分中声明的不是 public.
输入正确的部分后一切正常。
非常感谢
我正在使用 Delphi Rio。我创建了一个线程 class.
type
TThreadManager = class(TThread)
constructor Create;
end;
constructor TThreadManager.Create;
begin
inherited Create(True); // thread-ul va fi creat, dar nu va rula
// pentru a-l rula, folosim "Resume" (sau "Execute")
FreeOnTerminate := True; // thread-ul va fi distrus automat cand termina
Priority := tpNormal; // prioritatea thread-ului este minima
<- creating internal objects here
fIsSetupOk := False;
end;
但是,当我在应用程序中创建线程时,没有使用(这个)构造函数。没有可用的调试断点。也没有创建任何对象。
threadManager := TThreadManager.Create;
threadManager.Setup(dmMain.ibSessionMain);
threadManager.Resume;
因为没有进入这个构造函数,所以在访问对象时会引发AV。
有什么提示吗?
当然,我可以在别处(在设置中)创建对象,但这不是我想要的。
TThread
有自己的无参数 Create()
构造函数。您应该将您的声明为 reintroduce
以隐藏现有的,例如:
type
TThreadManager = class(TThread)
public
constructor Create; reintroduce;
end;
更好的选择是在 Create()
内部调用 Setup()
,然后设置 CreateSuspended=False
。这样,调用哪个构造函数就不会产生歧义,线程会在Setup()
完成后自动启动运行,eg:
type
TThreadManager = class(TThread)
public
constructor Create(Session: TIB_Session); reintroduce;
end;
constructor TThreadManager.Create(Session: TIB_Session);
begin
inherited Create(False);
FreeOnTerminate := True;
Priority := tpNormal;
<- creating internal objects here
fIsSetupOk := False;
Setup(Session);
end;
threadManager := TThreadManager.Create(dmMain.ibSessionMain);
或者,您可以将构造函数重命名为更有意义的名称,例如:
type
TThreadManager = class(TThread)
public
constructor CreateAndSetup(Session: TIB_Session);
end;
constructor TThreadManager.CreateAndSetup(Session: TIB_Session);
begin
inherited Create(False);
FreeOnTerminate := True;
Priority := tpNormal;
<- creating internal objects here
fIsSetupOk := False;
Setup(Session);
end;
threadManager := TThreadManager.CreateAndSetup(dmMain.ibSessionMain);
在我使用 remy 的建议 2 后,我在 我的代码 中发现了问题。
按照建议创建方法后(添加 TIB_SESSION 作为参数)我发现该方法不可用,因为在 protected 部分中声明的不是 public.
输入正确的部分后一切正常。
非常感谢