参考: 如何在通过线程执行工作负载时对微调器进行动画处理
我正在使用适用于iOS的Delphi xe5应用程序。在执行SQL查询时,我有一个TAniIndicator旋转。我正在使用线程 - 有关特定代码,请参阅上述文章。
一切正常,但是,当使用我在上一个问题中得到帮助的代码时,我注意到增加了延迟。在调试器下运行时,应用程序在以下几行之间挂起:
Thread.DoTerminate;
Thread.FFinished := True;
在 System.Classes Unit 的 ThreadProc 函数下
关于为什么的任何线索?或者我能做些什么来防止增加的 5 秒滞后?谢谢
更新回复:
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()链接到上述过程。
TThread.DoTerminate()
调用TThread.Synchronize()
以在主线程中触发TThread.OnTerminate
事件处理程序。 然后TThread
被阻止,直到主线程处理该请求 - 这不会立即发生,因为主线程必须首先检测和处理新消息 - 并且OnTerminate
处理程序退出。 只有这样,控制权才会返回给TThread
这样它才能完成它的逻辑。 因此,如果您在DoTerminate()
中遇到 5s 滞后,那么这意味着主线程需要 5s 来检测和处理Synchronize()
请求。