【发布时间】:2017-12-14 19:17:20
【问题描述】:
我正在使用如下所示的基本设置创建一个线程。显然一切正常,但是当我运行MyThread.Terminate 时,我注意到Destroy 没有运行。 Destroy 仅在关闭主应用程序时执行。
结束线程的正确方法是什么?
基本线程
// MyThread "TPoolingThread"
constructor TPoolingThread.Create;
begin
inherited Create(True);
// Initializing something
end;
destructor TPoolingThread.Destroy;
begin
inherited Destroy;
end;
procedure TPoolingThread.Execute;
begin
try
while (not Terminated) do begin
sleep(100);
// do something
end;
finally
if not Terminated then
Terminate;
end;
end;
执行线程
// Main Application
//////////////////////////////////////////
// Create and Start
MyThread := TPoolingThread.Create;
if Assigned(MyThread.FatalException) then
raise MyThread.FatalException;
MyThread.Start;
//////////////////////////////////////////
// Stop
MyThread.Terminate;
【问题讨论】:
-
Delphi 在 Android 上使用 ARC 进行对象生命周期管理。在清除所有对线程对象的引用之前,不会调用析构函数。调用
Terminate后,您是否正在清除MyThread指针?此外,FatalException仅在未捕获的异常从Execute逃逸时才设置,因此它永远不会在您显示的代码中设置。您可以在OnTerminate事件中检查它。如果Create失败,它将引发一个未存储在FatalException中的异常 -
不,我没有在调用 Terminate 后清除 MyThread 指针。我的基本代码仅此而已。我应该做 MyThread = nil 吗?关于
FatalException,好的。我会做的。谢谢! -
你的编辑把事情弄得一团糟。你不会从它的 Execute 方法中终止或线程。
-
@DalijaPrasnikar,我遵循了 Embarcadero 的一个示例,他们使用
try except我使用了try finally。finally错了吗?我只是想让线程优雅地结束,而仅通过使用调试,我就无法理解最正确的方法。 Embarcadero 示例是:docwiki.embarcadero.com/RADStudio/Tokyo/en/…。感谢您的帮助。 -
如何终止线程 - 使用 Terminate 方法(线程外的 Execute 方法)。为什么在终止时不调用 Destroy - 因为它与终止线程无关。其余的变成了调试会话,我无法帮助您,因为问题出在您看不到的其他代码中。我建议您再次编辑此问题 - 为您面临的问题制作完整且最小的示例,也许有人会回答。
标签: android multithreading delphi