Delphi - 未创建自定义线程
Delphi - Custom thread not being created
我这里有点问题。我有一个继承 TPersistent class 的自定义 class,在这个自定义 class 的内部(私有部分),我有一个自定义的 TThread,它具有覆盖的 Execute 方法,每(1000 毫秒)触发一次。一切都很好,直到我将我的 2 个自定义 classes 移动到一个新单元...
type
TMyThread= class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class(TPersistent)
private
T: TMyThread;
protected
constructor Create;
public
destructor Destroy; override;
end;
implementation
procedure TMyThread.Execute;
begin
while not Self.Terminated do begin
Sleep(1000);
MessageBox(0, 'test', nil, MB_OK)
end;
end;
constructor TMyClass.Create;
begin
inherited Create;
t := TMyThread.Create(False);
end;
destructor TMyClass.Destroy;
begin
t.Terminate;
t.WaitFor;
FreeAndNil(t);
inherited Destroy;
end;
上面的代码在主项目单元中工作得很好,但是当我将它移到一个新单元时,线程代码不再工作,当我尝试释放一个 TMyClass 对象时,我得到了一个 AV。我认为线程根本没有被构建,这就是为什么我在尝试释放它时得到一个 AV 的原因……但是为什么呢?代码在哪个单元中并不重要...
第一单元:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
p: TMyClass;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
p.Free; //Getting an AV
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
p := TMyClass.Create;
end;
end.
第 2 单元:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class(TPersistent)
private
T: TMyThread;
protected
constructor Create;
public
destructor Destroy; override;
end;
implementation
procedure TMyThread.Execute;
begin
while not Self.Terminated do begin
Sleep(1000);
MessageBox(0, 'test', nil, MB_OK)
end;
end;
constructor TMyClass.Create;
begin
inherited Create;
t := TMyThread.Create(False);
end;
destructor TMyClass.Destroy;
begin
t.Terminate;
t.WaitFor;
FreeAndNil(t);
inherited Destroy;
end;
end.
构造函数 TMyClass.Create
被声明为受保护。这意味着从另一个单元看不到它。因此 TMyClass.Create
不会被执行,而是调用 TObject.Create
。反过来,这意味着永远不会创建线程,并且在析构函数运行时遇到运行时错误,因为 T
是 nil
。
声明具有 public
可见性的构造函数。
我这里有点问题。我有一个继承 TPersistent class 的自定义 class,在这个自定义 class 的内部(私有部分),我有一个自定义的 TThread,它具有覆盖的 Execute 方法,每(1000 毫秒)触发一次。一切都很好,直到我将我的 2 个自定义 classes 移动到一个新单元...
type
TMyThread= class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class(TPersistent)
private
T: TMyThread;
protected
constructor Create;
public
destructor Destroy; override;
end;
implementation
procedure TMyThread.Execute;
begin
while not Self.Terminated do begin
Sleep(1000);
MessageBox(0, 'test', nil, MB_OK)
end;
end;
constructor TMyClass.Create;
begin
inherited Create;
t := TMyThread.Create(False);
end;
destructor TMyClass.Destroy;
begin
t.Terminate;
t.WaitFor;
FreeAndNil(t);
inherited Destroy;
end;
上面的代码在主项目单元中工作得很好,但是当我将它移到一个新单元时,线程代码不再工作,当我尝试释放一个 TMyClass 对象时,我得到了一个 AV。我认为线程根本没有被构建,这就是为什么我在尝试释放它时得到一个 AV 的原因……但是为什么呢?代码在哪个单元中并不重要...
第一单元:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
p: TMyClass;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
p.Free; //Getting an AV
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
p := TMyClass.Create;
end;
end.
第 2 单元:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class(TPersistent)
private
T: TMyThread;
protected
constructor Create;
public
destructor Destroy; override;
end;
implementation
procedure TMyThread.Execute;
begin
while not Self.Terminated do begin
Sleep(1000);
MessageBox(0, 'test', nil, MB_OK)
end;
end;
constructor TMyClass.Create;
begin
inherited Create;
t := TMyThread.Create(False);
end;
destructor TMyClass.Destroy;
begin
t.Terminate;
t.WaitFor;
FreeAndNil(t);
inherited Destroy;
end;
end.
构造函数 TMyClass.Create
被声明为受保护。这意味着从另一个单元看不到它。因此 TMyClass.Create
不会被执行,而是调用 TObject.Create
。反过来,这意味着永远不会创建线程,并且在析构函数运行时遇到运行时错误,因为 T
是 nil
。
声明具有 public
可见性的构造函数。