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()在主线程中定期调用,例如在计时器中.
| 归档时间: |
|
| 查看次数: |
1118 次 |
| 最近记录: |