以下代码中的两个构造均给出错误E2555无法捕获符号WriteToXMLFile
为什么?
当我尝试在匿名proc中使用AParameter并通过使用本地'lParameter:= AParameter',所以我认为本地proc也可以工作....
由于WriteToXMLFile包含我不想复制的代码,定义它的正确位置在哪里?
procedure DoStuff(AParameter: Integer);
procedure WriteToXMLFile;
begin
// ...
end;
begin
(* 1 *)
if GetCurrentThreadID= MainThreadID then
WriteToXMLFile
else
TThread.Synchronize(nil,WriteToXMLFile);
(* 2 *)
if GetCurrentThreadID= MainThreadID then
WriteToXMLFile
else
TThread.Synchronize(nil,procedure
begin
WriteToXMLFile;
end);
end;
编译器不支持在匿名方法中使用嵌套过程。
相反,以这种方式将嵌套过程更改为匿名方法:
procedure DoStuff(AParameter: Integer);
function CaptureWriteToXMLFile : TThreadProcedure;
begin
Result :=
procedure
begin
// Code here ...
end;
end;
var
WriteToXMLFile : TThreadProcedure;
begin
WriteToXMLFile := CaptureWriteToXMLFile();
if GetCurrentThreadID= MainThreadID then
WriteToXMLFile
else
TThread.Synchronize(nil,WriteToXMLFile);
end;
匿名函数返回TThreadProcedure
。局部变量被分配一个结果匿名方法,该匿名方法可以作为参数传递给Syncronize
过程。