来自AnonymousThread的结果-怎么样?

时间:2018-09-27 10:36:24

标签: 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; <-- error here because it is a procedure
      end).Start;
end;

如何使MyFunction在线程结束后返回temp变量?

我也尝试过这种方式:

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;

以这种方式编译,但是返回一个空字符串。该函数返回结果,并且不等待线程结束。

或者也许我做错了方法,因为我没有找到任何示例以这种方式做事吗?

2 个答案:

答案 0 :(得分:1)

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

aggregate(formula(paste('PATTERN_ID ~', exp_aggregate_by)), data, length)

(示例摘自该Embarcadero维基页面http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_TTask.IFuture_from_the_Parallel_Programming_Library

答案 1 :(得分:0)

您无法从匿名线程获得结果。 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;

然后您将其命名为:

  MyProc('abc',
    procedure(AValue: string)
    begin
      // do whatever you want with AValue
      Label1.Text := AValue;
    end);