1

我在 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;

我处于可以始终执行线程的地步,但微调器从未显示。当微调器在工作负载期间制作动画时,我如何执行“一些工作”?

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

更新:好的,所以使用以下来自 LU RD 的代码进行了更新......它有效,但是,我注意到增加了滞后。当在调试器下运行时,应用程序在两行之间挂起:

Thread.DoTerminate;
Thread.FFinished := True;

System.Classes 单元的 ThreadProc 函数下

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

4

1 回答 1

2

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

为禁用微调器的线程定义一个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 无响应。

于 2013-10-02T16:48:09.663 回答