我尝试做一个函数:
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;
以这种方式编译,但是返回一个空字符串。该函数返回结果,并且不等待线程结束。
或者也许我做错了方法,因为我没有找到任何示例以这种方式做事吗?
答案 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);