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

标签 ios sql multithreading delphi delphi-xe5

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

最佳答案

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

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

关于ios - 如何在通过线程执行工作负载时为微调器设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19141869/

相关文章:

sql - 如何删除重复项以便表中只存在对?

Mysql Group by Year and Count字段

java - iOS + appium java 客户端 : Long press TouchAction does not work?

IOS - 来自 NSBundle mainbundle 的 SQLite DB 路径返回 null

MySQL 查找不存在行的 id

c++ - OpenCV显示和处理网络摄像头流

python - 所有任务的单个工作线程还是多个特定的工作线程?

android - 我在 flutter 中实现以下设计时遇到问题

iPhone iOS 的图像调整大小以实现最低内存使用率解决方案

c# - WPF:轮询键盘