3

请参阅:如何在通过线程执行工作负载时为微调器设置动画

我正在使用适用于 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() 链接到上述过程。

4

1 回答 1

4

TThread.DoTerminate()调用以在主线程中TThread.Synchronize()触发事件处理程序。然后被阻塞,直到主线程处理该请求 - 这不会立即发生,因为主线程必须首先检测和处理新消息 - 并且处理程序退出。只有这样,控制权才会返回,以便它可以完成其逻辑。因此,如果您遇到 5s 延迟,则意味着主线程需要 5s 来检测和处理请求。TThread.OnTerminateTThreadOnTerminateTThreadDoTerminate()Synchronize()

于 2013-10-02T21:18:06.043 回答