gpt4 book ai didi

delphi - 如何在匿名方法中捕获变量?

转载 作者:行者123 更新时间:2023-12-02 22:44:59 24 4
gpt4 key购买 nike

此代码是否有效:

  TMyObj = class(Tobject)
public
FThread: TThread;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

constructor TMyObj.Create(AOwner: TComponent);
begin
inherited;
FThread:= TThread.createAnonymousThread(
procedure
begin
while not FThread.CheckTerminated do sleep(10000);
end);
FThread.start;
end;

destructor TMyObj.Destroy;
begin
inherited;
end;

我的问题是在我这样做之后

destructor TMyObj.Destroy;
begin
inherited;
end;

我的意思是当对象TMyObj被释放后,里面的FThread的值是多少

  FThread:= TThread.createAnonymousThread(
procedure
begin
while not FThread.CheckTerminated do sleep(10000);
end);

最佳答案

不,此代码无效。

重要的是要知道FThread不是捕获的,而是对包含实例的引用。所以匿名方法代码看起来像这样:

FThread := TThread.createAnonymousThread(
procedure
begin
while not Self.FThread.CheckTerminated do sleep(10000);
end);

编译器生成一个对象,该对象使用名为 Self 的字段来实现匿名方法。捕获对 TMyObj 的引用实例。如果当匿名方法在线程中处于事件状态时该实例被销毁,它将有一个悬空引用。

使用 TThread.CreateAnonymousThread() 创建的线程完成后会自动销毁。因此,如果您将其存储在字段中以供以后访问,则至少需要将 FreeOnTerminate off 并且不通过捕获的变量将其引用到线程本身,而是使用 TThread.Current 。在匿名方法中,这将为您提供该方法正在运行的线程。

关于delphi - 如何在匿名方法中捕获变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57458982/

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