我在iOS设备的Delphi xe5应用程序中使用多个线程时遇到麻烦。我的目标是在使TAniIndicator旋转的同时执行“某些工作”(SQL查询)。我尝试使用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;
我现在可以始终如一地让线程执行,但是微调器从不显示。当微调器在工作负荷期间设置动画时,如何执行“某些工作”?
谢谢您使用Delphi xe5开发iOS应用程序。
更新:好的,因此使用LU RD中的以下代码进行更新…可以,但是,我注意到添加了滞后。在调试器下运行时,应用程序会在两行之间挂起:
Thread.DoTerminate; Thread.FFinished := True;
在System.Classes单元的ThreadProc函数下
为什么有任何线索?或者我可以做些什么来防止增加5秒钟的延迟?谢谢
在启动线程之前,启用微调器。
OnTerminate为您的线程定义一个禁用微调器的方法。
OnTerminate
在线程中进行工作,当线程准备就绪时,请OnTerminate注意卸下微调器。
注意:因为FreeOnTerminate是真的,所以无需显式释放线程。
FreeOnTerminate
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;
这里重要的是程序流是事件驱动的。不需要轮询,这可能会耗尽CPU周期并使GUI无响应。