Delphi 在不阻塞主线程的情况下获得 TTask.IFuture?
Delphi getting TTask.IFuture without blocking main thread?
在下面的示例中(来自 Embarcadero 的手册),大约 3 秒后将检索 MyValue。但是,主 gui 线程将被 MyValue 阻塞:= FutureObject.Value;将等待结果的调用。
如果 Future 代码需要很长时间,比方说 30 秒,我猜 Windows 将在程序标题中显示“...未响应”。
那么,当它阻塞主 gui 线程时,它的目的是什么?
有没有其他方法可以在不阻塞主 gui 线程的情况下获得结果?
FutureObject := TTask.Future<Integer>(function: Integer
begin
Sleep(3000);
Result := 16;
end);
// …
MyValue := FutureObject.Value;
根据设计,IFuture.Value
属性 会阻塞调用线程,直到另一个线程分配一个值。因此,如果您在主线程中读取 Value
,它将阻塞主线程,直到准备好一个值。
如果你必须在主线程中不阻塞地读取Value
,你可以:
使用计时器或其他异步机制定期查询 IFuture.Status
属性 以检查 IFuture
何时准备好在实际读取值之前提供值.
让并行任务在准备就绪时向主线程发送信号,然后主线程可以在其信号处理程序中读取Value
。
我知道这可能有点晚了,但我通过创建一个 TTask 来解决它
我的价值 := FutureObject.Value
FutureObject := TTask.Future<Integer>(function: Integer
begin
Sleep(3000);
Result := 16;
end);
// …
TTask.Run(Procedure begin
MyValue := FutureObject.Value;
end);
在下面的示例中(来自 Embarcadero 的手册),大约 3 秒后将检索 MyValue。但是,主 gui 线程将被 MyValue 阻塞:= FutureObject.Value;将等待结果的调用。 如果 Future 代码需要很长时间,比方说 30 秒,我猜 Windows 将在程序标题中显示“...未响应”。 那么,当它阻塞主 gui 线程时,它的目的是什么? 有没有其他方法可以在不阻塞主 gui 线程的情况下获得结果?
FutureObject := TTask.Future<Integer>(function: Integer
begin
Sleep(3000);
Result := 16;
end);
// …
MyValue := FutureObject.Value;
根据设计,IFuture.Value
属性 会阻塞调用线程,直到另一个线程分配一个值。因此,如果您在主线程中读取 Value
,它将阻塞主线程,直到准备好一个值。
如果你必须在主线程中不阻塞地读取Value
,你可以:
使用计时器或其他异步机制定期查询
IFuture.Status
属性 以检查IFuture
何时准备好在实际读取值之前提供值.让并行任务在准备就绪时向主线程发送信号,然后主线程可以在其信号处理程序中读取
Value
。
我知道这可能有点晚了,但我通过创建一个 TTask 来解决它 我的价值 := FutureObject.Value
FutureObject := TTask.Future<Integer>(function: Integer
begin
Sleep(3000);
Result := 16;
end);
// …
TTask.Run(Procedure begin
MyValue := FutureObject.Value;
end);