如何通过线程执行工作负载时使微调器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不响应。