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

时间:2014-04-14 21:32:36

标签: multithreading delphi delphi-xe5

我在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模拟器进行测试。 谢谢 !

1 个答案:

答案 0 :(得分:21)

问题是FireMonkey中TThread.Synchronize()已损坏。请参阅此QC报告:

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

这刚刚被发现,但自从FireMonkey首次推出以来,它已被打破,直到现在才有人注意到。

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