我在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模拟器进行测试。 谢谢 !
答案 0 :(得分:21)
问题是FireMonkey中TThread.Synchronize()
已损坏。请参阅此QC报告:
Report #123579: TThread.Synchronize() and TThread.Queue() do not work correctly in FireMonkey
这刚刚被发现,但自从FireMonkey首次推出以来,它已被打破,直到现在才有人注意到。
在Embarcadero修复它之前,请尝试在主线程中定期调用CheckSynchronize()
,例如在计时器中。