Приложение занимает очень много времени, чтобы синхронизировать потоки (или вообще нет)
Я использую компоненты 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()
периодически в основном потоке, например, в таймере.