gpt4 book ai didi

multithreading - 后台线程何时阻止进程被终止?

转载 作者:行者123 更新时间:2023-12-03 15:01:52 25 4
gpt4 key购买 nike

我们的程序在程序开始时创建一个后台线程。后台线程使用 Indy 进行一些数据库完整性检查并检查互联网上的内容。 10 秒后,后台线程应该完成,并且由于 FreeOnTerminate 为 true,它也会自行清理。

我们注意到,在某些情况下,如果用户关闭程序太快,进程仍将处于事件状态,直到后台线程完成。

由于我们无法准确重现该问题,我创建了一个演示项目来尝试一些操作:

type
TBackgroundThread = class(TThread)
protected
procedure Execute; override;
end;

{ TForm1 }

var
bt: TBackgroundThread;

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
// Create a background thread which runs X seconds and then terminates itself.
bt := TBackgroundThread.Create(false);
bt.FreeOnTerminate := true;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
// The user closes the app while the background thread is still active
Sleep(2000);
Close;
end;

{ TBackgroundThread }

procedure TBackgroundThread.Execute;
var
i: integer;
x: cardinal;
begin
inherited;

// Simulate some work that the background thread does
x := MaxInt;
for i := 0 to MaxInt do
begin
x := Random(x);
end;
end;

结果让我有点惊讶:关闭 MainForm 后,进程将立即终止,后台线程将被硬终止。

现在我对此有几个问题:

  1. MainForm 关闭(= 主线程退出)后,我应该通过 .Terminate 手动终止所有创建的线程还是自动完成?

  2. 我的线程应该只检查 Self.Termminate 还是还应该检查 Application.Termulated?

  3. 为什么当我关闭应用程序时,如上所示的繁忙线程会立即被终止?我预计进程 Project1.exe 将运行,直到所有线程自行完成。 (如上所述,我们看到一个应用程序的主窗体已关闭,但线程正在阻止关闭过程)。

  4. 那么,我们真正的应用程序进程怎么可能不会因为正在运行的后台线程而终止呢?它可能与互联网有关,这可能会导致应用程序等待,直到达到连接超时?

最佳答案

关闭主窗体并不等同于退出主线程。表单关闭后代码继续运行。特别是,单位已经最终确定。

如果您处理测试线程的 OnTerminate 事件,或在 Terminate 方法中放置断点,您将看到程序退出时不会自动调用它。你必须自己调用它。但还要注意,线程不会仅仅因为调用 Terminate 就停止运行。它会继续运行,直到自行停止或被强制终止。调用 WaitFor 等待其终止。

不必费心检查Application.Termulated;线程的属性应该足够了。

当您的程序退出时,您的线程会被强制终止,因为您的程序最终会调用 ExitProcess,而操作系统所做的事情之一就是终止所有其他线程。它不会对它们调用Terminate,因为操作系统不了解 Delphi 类和方法。

您必须进行更多调试,以确定为什么您的程序没有为您的客户立即终止。您说您无法在内部重现该问题,并且您编写的测试程序也没有表现出该问题。您必须找到愿意配合您进一步调试工作的客户。您真的知道是支撑事情的线索,还是到目前为止只是猜测?

关于multithreading - 后台线程何时阻止进程被终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23829532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com