首页 > 解决方案 > AnonymousThread 的结果 - 怎么样?

问题描述

我尝试制作一个功能:

function MyFunction(parameter:string) : string;
begin
      TThread.CreateAnonymousThread(procedure ()
      var temp : string;
      begin
           temp := paramet;
           //some works on temp variable
           result := temp; <-- error here because it is a procedure
      end).Start;
end;

如何让 MyFunction 在线程结束后返回临时变量?

我也试过这样:

function MyFunction(parameter:string) : string;
vat temp : string;
begin
      TThread.CreateAnonymousThread(procedure ()
      begin
           temp := paramet;
            //some works on temp variable
      end).Start;
result := temp;
end;

这样它编译但返回一个空字符串。该函数返回结果并且不等待结束线程。

或者也许我做错了,因为我没有找到任何例子如何做到这一点?

标签: multithreadingdelphidelphi-xe5

解决方案


您不能使用新并行编程库中的 TTask.IFuture 吗?它以非常简洁和优雅的方式完全满足您的需求:

FutureObject := TTask.Future<Integer>(function: Integer
     begin
        Sleep(3000);   // to simulate "background processing"
        Result := 16;  // result to be returned as "FutureObject.Value"
     end);

MyValue := FutureObject.Value;  // this waits for the value to be available, if it isn't yet

(示例取自这个 embarcadero wiki 页面http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_TTask.IFuture_from_the_Parallel_Programming_Library


推荐阅读