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