Приложение занимает очень много времени, чтобы синхронизировать потоки (или вообще нет)

Я использую компоненты REST в Delphi XE5 (iOS и Android). В настоящее время я тестирую симулятор 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;

Это либо НЕ возвращает поток в. Синхронизировать или принимать очень длительное время (5 минут или около того). Он работал один раз во время отладки, но не с тех пор и снова только сейчас (через 30 минут и после того, как он установил 5 минут, чтобы вернуть поток).

Помощь? Или, по крайней мере, любое чувство руководства, которое может мне дать?

Опять же, разработка для iOS и Android (так FMX...) и в настоящее время тестирование через iOS симулятор. Благодарю!

Ответы

Ответ 1

Проблема заключается в том, что TThread.Synchronize() нарушается в FireMonkey. См. Этот отчет QC:

Отчет # 123579: TThread.Synchronize() и TThread.Queue() не работают корректно в FireMonkey

Это только недавно было обнаружено, но оно было повреждено, так как FireMonkey был впервые представлен, и до сих пор никто не заметил.

До тех пор, пока Embarcadero не исправит это, попробуйте называть CheckSynchronize() периодически в основном потоке, например, в таймере.