【发布时间】:2012-01-10 14:59:56
【问题描述】:
在给定的示例中,我在调用 AThread.Free. 时收到异常
program Project44;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, Windows;
type
TMyException = class(Exception);
var
AThread: TThread;
begin
AThread := TThread.Create(True);
try
AThread.FreeOnTerminate := True;
//I want to do some things here before starting the thread
//During the setup phase some exception might occur, this exception is for simulating purpouses
raise TMyException.Create('exception');
except
AThread.Free; //Another exception here
end;
end.
我有两个问题:
在给定的示例中,我应该如何释放
AThread的TThread实例?我不明白,为什么
TThread.Destroy在自我毁灭之前调用Resume。这有什么意义?
【问题讨论】:
-
首先,您是否收到任何错误/警告? TThread.Execute 在 D2009 中是抽象的。 IME,您应该收到有关使用抽象方法构造实例的警告。通常, TThread.Execute 在 TThread 后代类中被覆盖,并且被实例化的是那个后代。我从来没有尝试过直接创建 TThread 的实例——我很确定在构造线程、构造线程或两者上都会引发一些异常。
-
你可以等到设置
FreeOnTerminate,直到你打电话给Resume。 -
我猜销毁调用会恢复,因为如果一个线程被挂起,它就不能在这种状态下被正确地销毁。
-
创建挂起的线程是自找麻烦。如果您在创建线程之前执行设置阶段,然后将其创建为非挂起,那么所有问题都消失了。
FreeOnTerminate可以在TThread.Create构造函数中设置。 -
@LURD 实现这一目标的简单方法是将所有设置移动到构造函数中。
标签: delphi exception delphi-2009 tthread