multithreading - 创建 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。
有什么提示吗?
当然,我可以在其他地方(进入设置)创建对象,但这不是我想要的。
解决方案
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);
推荐阅读
- ios - 如何理解飞镖异步操作?
- c# - 为什么一个空类会作为几个泛型类的基类?
- recipe - 奇点容器中的默认路径
- vxworks - vxworks 653 和 vxworks 7 有什么区别
- html - 使用 CSS 隐藏数据值
- jquery - jquery查找所有带有li父级的chaild DIV元素
- sharepoint-2013 - 如何使用 REST API ajax 按视图名称获取列表项?
- android - 开始构建 Android ROM
- swift - macOS App Development 和 Release 版本之间的不同行为
- algorithm - 迪杰斯特拉算法。到达被其他节点从当前节点“切断”的未访问节点