代码之家  ›  专栏  ›  技术社区  ›  user7415109

Delphi正在获取TTask。IFuture不阻塞主线程?

  •  1
  • user7415109  · 技术社区  · 7 年前

    在下面的示例中(来自Embarcadero的手册),大约3秒后将检索MyValue。但是,主gui线程将被MyValue:=FutureObject阻塞。价值将等待结果的调用。 如果未来的代码需要很长时间,比如说30秒,我想Windows会在程序标题中显示“…没有响应”。 那么,当它将阻止主gui线程时,它的目的是什么? 有没有其他方法可以在不阻塞主gui线程的情况下获得结果?

    FutureObject := TTask.Future<Integer>(function: Integer
        begin
            Sleep(3000);
            Result := 16;
        end);
    // …
    MyValue := FutureObject.Value;
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Remy Lebeau    7 年前

    根据设计 IFuture.Value 属性阻塞调用线程,直到另一个线程分配值。所以,如果你阅读 Value 在主线程中,它将阻塞主线程,直到值准备就绪。

    如果你必须阅读 价值 在没有阻塞的主线程中,您可以:

    • 使用计时器或其他异步机制定期查询 IFuture.Status 属性时要检查的属性 IFuture 准备在实际读取之前提供值。

    • 当主线程准备好时,让并行任务向其发送信号,然后主线程可以读取 价值 在其信号处理器中。

        2
  •  1
  •   SaulVP    5 年前

    我知道可能有点晚了,但我通过创建一个TTask解决了这个问题 MyValue:=未来对象。价值

    FutureObject := TTask.Future<Integer>(function: Integer
    begin
        Sleep(3000);
        Result := 16;
    end);
    // …
    TTask.Run(Procedure begin
    MyValue := FutureObject.Value;
    end);