多线程 – 应用程序需要很长时间才能同步线程(或根本没有)

我在Delphi XE5(iOS和Android)中使用REST组件。我正在通过iOS模拟器测试,我的应用程序经常挂在我的代码中的以下行:

R_Request.Execute;

经过一些调试,我发现它专门挂在REST.Client.PAS中的这一行代码:

HandleEvent(DoAfterExecute);

看起来像:

procedure TCustomRESTRequest.HandleEvent(AEventHandler: TMethod);
begin
  // Handle Synchronized if we are NOT already in the main thread
  // NEVER call synchronize on the MainThread - that might shift the island!
  if SynchronizedEvents and (System.MainThreadID <> TThread.CurrentThread.ThreadID) then
    TThread.Synchronize(TThread.CurrentThread, AEventHandler) // FAILS HERE
  else
    AEventHandler;
end;

它不是在.Synchronize中返回线程或花费很长时间(5分钟左右)…
它在调试时工作一次,但从来没有一次又一次(30分钟后,之后放置5分钟返回线程)。

帮帮我 ?还是至少有任何人可以给我的方向感?

再次,开发iOS和Android(所以FMX …),目前通过iOS模拟器测试。
谢谢 !

最佳答案
问题是在FireMonkey中,TThread.Synchronize()被中断。见这个QC报告:

Report #123579: TThread.Synchronize() and TThread.Queue() do not work correctly in FireMonkey

这只是最近才被发现,但是自从FireMonkey首次推出以来,它已经被打破,直到现在还没有人明显注意到。

在Embarcadero修复它之前,请尝试在主线程中定期调用CheckSynchronize(),如定时器。

转载注明原文:多线程 – 应用程序需要很长时间才能同步线程(或根本没有) - 代码日志