在firemonkey移动开发人员中正确使用TAniIndicator等待处理 [英] Correctly using TAniIndicator in firemonkey mobile dev for wait for processing
问题描述
我正在使用Delphi XE-5(Firemonkey移动应用程序)
I am using Delphi XE-5 (Firemonkey Mobile Application)
我正在尝试在长时间的处理过程中进行显示,以使TAniIndicator正常工作。
我的主窗体上有一个TAniIndicator(AniIndi),但它不会旋转。
I am trying to get the TAniIndicator to work, by displaying during my long processing. I have a TAniIndicator (AniIndi) on my main form, but it does not spin. It displays correctly, but does not spin.
begin
Loading:= True;
AniIndi.Visible:= True;
AniIndi.Enabled:= True;
UpdateAll;
Application.ProcessMessages;
//do my processsing here
Loading:= False;
AniIndi.Enabled:= False;
AniIndi.Visible:= False;
UpdateAll;
Application.ProcessMessages;
end;
//根据雷米的答案进行编辑
//EDIT BASED ON REMY's ANSWER
TLoadThread = class(TThread)
public
Config: Boolean;
constructor Create(const aConfig: Boolean); reintroduce;
protected
procedure DoProcessing;
procedure Execute; Override;
end;
var
loading: Boolean = false;
zLThread: TLoadThread = nil;
constructor TLoadThread.Create(const aConfig: Boolean);
begin
inherited Create(true);
Config:= aConfig;
end;
procedure TLoadThread.DoProcessing;
var
begin
//do processing here and update main form
end;
procedure TLoadThread.Execute;
begin
FreeOnTerminate:= true;
Synchronize(DoProcessing);
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
zLThread:= TLoadThread.Create(True, Host, NamePath, Config, Port);
zLThread.OnTerminate := ThreadTerminated;
zLThread.Start;
Loading := True;
AniIndi.Visible := True;
AniIndi.Enabled := True;
UpdateAll;
end;
procedure TfrmMain.ThreadTerminated(Sender: TObject);
begin
zLThread := nil;
Loading := False;
AniIndi.Enabled := False;
AniIndi.Visible := False;
UpdateAll;
end;
推荐答案
您的主线程需要保持对消息队列的响应当您的长进程正在运行时。否则,您将阻止动画(以及UI的其他方面)接收新消息,例如绘画请求和计时器通知。您需要将任何长时间的处理移至单独的线程。启动线程,然后开始动画。同时让主线程正常处理UI。线程完成后,让它通知主线程,然后该主线程可以停止动画,并完成对线程结果(如果有)所需的任何其他处理。例如:
Your main thread needs to stay responsive to the message queue while your long process is running. If not, you are blocking the animation (and other aspects of the UI) from receiving new messages, like paint requests and timers notifies. You need to move any long processing to a separate thread instead. Start the thread and then start the animation. Let the main thread handle the UI normally in the meantime. When the thread is finished, have it notify the main thread, which can then stop the animation, and finish any other processing it needs on the result of the thread, if any. For example:
type
TLoadThread = class(TThread)
public
Host: string;
NamePath: string;
Port: Integer;
Config: Boolean;
constructor Create(const aHost, aNamePath: string; aPort: Integer; aConfig: Boolean); reintroduce;
protected
procedure Execute; override;
end;
constructor TLoadThread.Create(const aHost, aNamePath: string; aPort: Integer; aConfig: Boolean);
begin
inherited Create(True);
FreeOnTerminate := True;
Host := aHost;
NamePath := aNamePath;
Port := aPort;
Config := aConfig;
end;
procedure TLoadThread.Execute;
begin
//do processing
Synchronize(
procedure
//update main form
end
);
//do processing
end;
var
Loading: Boolean = False;
zLThread: TLoadThread = nil;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
zLThread := TLoadThread.Create(Host, NamePath, Port, Config);
zLThread.OnTerminate := ThreadTerminated;
zLThread.Start;
Loading := True;
AniIndi.Visible := True;
AniIndi.Enabled := True;
UpdateAll;
end;
procedure TfrmMain.ThreadTerminated(Sender: TObject);
begin
zLThread := nil;
Loading := False;
AniIndi.Enabled := False;
AniIndi.Visible := False;
UpdateAll;
end;
这篇关于在firemonkey移动开发人员中正确使用TAniIndicator等待处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!