Multithreading 匿名线程的结果-如何?

Multithreading 匿名线程的结果-如何?,multithreading,delphi,delphi-xe5,Multithreading,Delphi,Delphi Xe5,我尝试创建一个函数: function MyFunction(parameter:string) : string; begin TThread.CreateAnonymousThread(procedure () var temp : string; begin temp := paramet; //some works on temp variable result := temp; <

我尝试创建一个函数:

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
在线程完成之前立即返回


一种解决方案是使用在线程完成其工作后调用的完成处理程序

procedure MyProc(parameter: string; Completion: TProc<string>);
begin
  TThread.CreateAnonymousThread(
    procedure
    var
      temp: string;
    begin
      // do something with parameter 
      temp := UpperCase(parameter);
      TThread.Synchronize(nil,
        procedure
        begin
          Completion(temp);
        end);
    end).Start;
end;

您不能使用新的并行编程库中的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
FutureObject:=TTask.Future(函数:整数
开始
Sleep(3000);//模拟“后台处理”
结果:=16;//将作为“FutureObject.Value”返回的结果
(完),;
MyValue:=FutureObject.Value;//这将等待该值可用(如果尚未可用)

(示例取自embarcadero wiki页面

第一个解决方案返回空字符串(首先返回,然后运行我的线程)第二个解决方案:我必须添加到哪个单元?TTask或ITask类型?您没有理解第一个解决方案的要点。它是过程而不是函数,如果您将其转换为函数,它将不起作用,原因与第二个示例不起作用相同。TTask是在XE7中引入的。这使得您在任务完成时可以使用回调过程。如果
MyFunction
在退出之前需要等待结果,那么使用线程就没有意义了。
  MyProc('abc',
    procedure(AValue: string)
    begin
      // do whatever you want with AValue
      Label1.Text := AValue;
    end);
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