【问题标题】:How to get rid of lag when working with multi threading使用多线程时如何摆脱延迟
【发布时间】:2013-10-02 21:05:27
【问题描述】:

参考:How to animate a spinner while performing a workload via threading

我正在使用适用于 iOS 的 Delphi xe5 应用程序。在执行 SQL 查询时,我有一个 TAniIndicator 旋转。我正在使用线程 - 有关特定代码,请参阅上述文章。

一切正常,但是,当使用我在上一个问题中得到帮助的代码时,我注意到增加了延迟。在调试器下运行时,应用程序在行之间挂起:

Thread.DoTerminate;
Thread.FFinished := True;

System.Classes单元的ThreadProc函数下

关于为什么的任何线索?或者我能做些什么来防止增加 5 秒的延迟?谢谢

更新对 TLama 的回复:

procedure TForm_Login.WorkIsDone(Sender : TObject);
begin
  Form_Login.LoadSpinnerFrame.visible := False;
  Form_Login.LoadSpinner.Visible := False;
  Form_Login.LoadSpinner.Enabled := False;
  Form_Login.btnLogin.Text := 'Logout';
  Form_Login.btnLogin.Enabled := True;
  if GoodLogin = 1 then
    Main_Form.show;
end;

我的 onTerminate() 链接到上述过程。

【问题讨论】:

  • 你线程的OnTerminate事件方法中有代码吗?
  • 问题已更新,谢谢
  • @norgepaul 说 XE5 for iOS 的微调器中有一个“已知”错误。它与调用 OnTerminate 时处于活动状态的微调器有关。质量控制是#117572。还有#118973。
  • 所以最好的办法是模拟一个旋转组件,至少在修复这个错误之前。可能可以通过计时器和带有交替图标的图像来完成。
  • 在 FMX 库中找到此组件,FMX.Ani.TBitmapListAnimation。似乎动画做得很好。

标签: ios multithreading delphi delphi-xe5


【解决方案1】:

TThread.DoTerminate() 调用 TThread.Synchronize() 在主线程中触发 TThread.OnTerminate 事件处理程序。然后TThread 被阻塞,直到主线程处理该请求——这不会立即发生,因为主线程必须首先检测和处理新消息——并且OnTerminate 处理程序退出。只有这样,控制权才会返回给TThread,这样它才能完成其逻辑。所以如果你在DoTerminate()中遇到了5s的延迟,那么说明主线程需要5s来检测和处理Synchronize()的请求。

【讨论】:

  • 那么我能做些什么吗?
  • 对于有关此问题的其他答案寻求者。查看上面对 OP 的回复中的 cmets
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多