使用多线程时如何摆脱滞后

时间:2013-10-02 21:05:28

标签: ios multithreading delphi delphi-xe5

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

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

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

Thread.DoTerminate;
Thread.FFinished := True;

在System.Classes Unit的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()与上述程序相关联。

1 个答案:

答案 0 :(得分:4)

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