gpt4 book ai didi

multithreading - 如何在线程运行完毕之前停止它?

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

我有一个名为 TMyThread 的线程,我重写了执行过程,如下所示:

 procedure TMyThread.Execute;
Begin
repeat
//Some Work
Sleep(5000);
//Some Work 2;
Sleep(5000);
until FActive=False
End;

在主窗体中,我有一个名为“销毁我的线程”的按钮。我想销毁我的线程,但问题是我的线程只有在完成其工作后才会被销毁。我想销毁我的线程,即使它还没有完成它的工作。我该怎么做?

最佳答案

线程的 Execute 方法必须定期检查线程的 Termminate 属性的状态。如果它是True,那么线程Execute方法必须退出。

因此,典型的 Execute 方法可能如下所示:

procedure TMyThread.Execute;
begin
while not Terminated do
DoNextPieceOfWork
end;

看起来您的线程有自己的 FActive 标志正在执行相同的任务。问题在于 TThread 不知道这一点。因此,您应该摆脱 FActive 并使用内置机制。

当您在线程上调用Free时,它将调用Terminate。这会将 Termied 设置为 True。然后等待线程方法退出。发生这种情况是因为您的线程注意到 TermiedTrue 并退出。然后线程的析构函数可以继续并完成线程的整理工作。

<小时/>

看看您答案中的代码,最好利用现有的Terminate机制来编写。

type
TMyThread = class(TThread)
private
FTerminateEvent: TEvent;
protected
procedure Execute; override;
procedure TerminatedSet; override;
public
constructor Create(ACreateSuspended: Boolean);
destructor Destroy; override;
end;

constructor TMyThread.Create(ACreateSuspended: Boolean);
begin
inherited Create(ACreateSuspended);
FTerminateEvent := TEvent.Create(nil, True, False, '');
end;

destructor TMyThread.Destroy;
begin
inherited;
FTerminateEvent.Free;
end;

procedure TMyThread.TerminatedSet;
begin
FTerminateEvent.SetEvent;
end;

procedure TMyThread.Execute;
begin
while not Terminated do
begin
// do somthing interesting!
FTerminateEvent.WaitFor(5000);
end;
end;

现在不需要单独的 Stop 方法。您只需在线程上调用Free即可。然后调用Terminate。然后TermatedSet被调用。然后该事件被发出信号。然后执行终止。然后线程就可以消失。

<小时/>

话虽如此,我正在努力想象 5000 毫秒超时是最佳方法的场景。我不知道你为什么要这样做,但我猜你是在试图限制线程,使其不会运行得过热。您想避免繁忙的循环。这是令人钦佩的,但使用固定超时并不是做到这一点的方法。执行此操作的方法是等待同步事件,通常是一个事件。然后,当有更多工作要做时,该事件将发出信号并唤醒您的线程。

关于multithreading - 如何在线程运行完毕之前停止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033894/

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