首页 > 解决方案 > 创建 TThread 没有进入我的 Create() 方法

问题描述

我正在使用德尔福 Rio。我创建了一个线程类。

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;

但是,当我在应用程序中创建线程时,不使用 (this) 构造函数。没有可用的调试断点。而且也没有创建任何对象。

threadManager := TThreadManager.Create;
threadManager.Setup(dmMain.ibSessionMain);
threadManager.Resume;

因为没有进入这个构造函数,所以在访问对象时会引发一个 AV。

有什么提示吗?

当然,我可以在其他地方(进入设置)创建对象,但这不是我想要的。

标签: multithreadingdelphi

解决方案


TThread有自己的无参数Create()构造函数。你应该声明你reintroduce的隐藏现有的,例如:

type
  TThreadManager = class(TThread)
  public
    constructor Create; reintroduce;
  end;

更好的选择是在自身Setup()内部调用Create(),然后设置CreateSuspended=False. 这样,调用哪个构造函数就没有歧义了,线程将在Setup()完成后自动开始运行,例如:

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);

推荐阅读