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

Thi*_*Guy 16 delphi multithreading delphi-xe5

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

R_Request.Execute;
Run Code Online (Sandbox Code Playgroud)

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

HandleEvent(DoAfterExecute);
Run Code Online (Sandbox Code Playgroud)

看起来像:

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;
Run Code Online (Sandbox Code Playgroud)

它要么不在.Synchronize中返回线程,要么花费很长时间(大约5分钟)...它在调试时工作了一次,但是从现在开始一直没有(30分钟后,在设置之后) 5分钟返回一个帖子).

救命 ?或者至少任何人都可以给我的方向感?

再次,开发iOS和Android(所以FMX ...),目前正在通过iOS模拟器进行测试.谢谢 !

Rem*_*eau 21

问题是TThread.Synchronize()在FireMonkey 中被破坏了.查看此QC报告:

报告#123579:TThread.Synchronize()和TThread.Queue()在FireMonkey中无法正常工作

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

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

  • 是的,当我找到它时,我感到很震惊,并且没有好办法手动实现`WakeMainThread()`以跨平台方式"唤醒"主线程,因为不同的平台处理主线程事件队列的方式不同.至少`CheckSynchronize()`本身是跨平台的,但是让RTL调用它是PITA,除非你自己调用它. (3认同)