小编典典

如何在通过线程执行工作负载时为微调框设置动画

sql

我在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秒钟的延迟?谢谢


阅读 172

收藏
2021-04-22

共1个答案

小编典典

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

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

在线程中进行工作,当线程准备就绪时,请OnTerminate注意卸下微调器。

注意:因为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无响应。

2021-04-22