如何通过线程执行工作负载时使微调器animation

我在使用iOS设备的Delphi xe5应用程序中的多个线程遇到麻烦。 我的目标是执行“一些工作”(SQL查询),而TAniIndicator正在旋转。 我尝试过使用Applicaiton.ProcessMessages(),但是如果有时候旋转的话,这并不能保持微调器的顺利加载。

这是我目前的代码为btn.OnClick

begin if btnLogin.Text = 'Login' then begin aThread := TMyThread.Create(True); aThread.FreeOnTerminate := true; aThread.Start; while Mode1 = 0 do begin Form_Login.LoadSpinnerFrame.visible := True; Form_Login.LoadSpinner.Visible := True; Form_Login.LoadSpinner.Enabled := True; // Application.ProcessMessages; end; Form_Login.LoadSpinnerFrame.visible := False; Form_Login.LoadSpinner.Visible := False; Form_Login.LoadSpinner.Enabled := False; btnLogin.Text := 'Logout'; aThread.Destroy; end else begin btnLogin.Text := 'Login'; end; 

这里是thread.execute方法的代码

 procedure TMyThread.Execute; begin Form_login.mode1 := 0; Sleep(5000); Form_login.mode1 := 1; end; 

我正处在一个可以持续执行Thread的地步,但是Spinner永远不会显示。 在工作负荷期间,如何进行“一些工作”,而微调员正在进行animation制作?

谢谢,使用Delphi xe5开发iOS应用程序。

更新:好的,使用下面的代码从LU RD更新…它的作品,但是,我注意到增加了滞后。 在debugging器下运行时,应用程序在各行之间挂起:

 Thread.DoTerminate; Thread.FFinished := True; 

在System.Classes单元的ThreadProc函数下

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

在启动线程之前启用您的微调器。

为您的线程定义禁用微调器的OnTerminate方法。

在线程中完成您的工作,并准备就绪后, OnTerminate负责移除微调器。

注意:由于FreeOnTerminate为true,因此不需要显式释放线程。

 begin if btnLogin.Text = 'Login' then begin Form_Login.LoadSpinnerFrame.visible := True; Form_Login.LoadSpinner.Visible := True; Form_Login.LoadSpinner.Enabled := True; btnLogin.Enabled := False; aThread := TMyThread.Create(True); aThread.FreeOnTerminate := true; aThread.OnTerminate := Self.WorkIsDone; aThread.Start; end else begin btnLogin.Text := 'Login'; end; procedure TYourForm.WorkIsDone(Sender : TObject); begin Form_Login.LoadSpinnerFrame.visible := False; Form_Login.LoadSpinner.Visible := False; Form_Login.LoadSpinner.Enabled := False; btnLogin.Text := 'Logout'; btnLogin.Enabled := True; end; procedure TMyThread.Execute; begin // Make your work end; 

这里重要的是程序stream程是事件驱动的。 不需要轮询,这会消耗CPU周期并使GUI不响应。