результат от AnonymousThread - как? - PullRequest
       12

результат от AnonymousThread - как?

0 голосов
/ 27 сентября 2018

Я пытаюсь сделать функцию:

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;

таким образом он компилируется, но возвращает пустую строку.функция возвращает результат и не ожидает завершения потока.

Или, может быть, я делаю это неправильно, потому что я не нашел ни одного примера, как это сделать?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Не можете ли вы использовать 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 http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_TTask.IFuture_from_the_Parallel_Programming_Library

0 голосов
/ 27 сентября 2018

Вы не можете получить результат от анонимного потока.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);
...