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