“无法捕获符号”,用于Synchronize()中的本地过程

问题描述 投票:0回答:1

以下代码中的两个构造均给出错误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;
delphi parallel-processing parameter-passing delphi-10.3-rio
1个回答
0
投票

编译器不支持在匿名方法中使用嵌套过程。

相反,以这种方式将嵌套过程更改为匿名方法:

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过程。

© www.soinside.com 2019 - 2024. All rights reserved.