delphi – 在firemonkey移动开发中正确使用TAniIndicator等待处
发布时间:2020-12-15 09:43:12 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi XE-5(Firemonkey移动应用程序) 我想通过在长时间处理期间显示来让TAniIndicator工作. 我的主表单上有一个TAniIndicator(AniIndi),但它没有旋转.它显示正确,但不旋转. begin Loading:= True; AniIndi.Visible:= True; AniIndi.Enabled:= Tru
我正在使用Delphi XE-5(Firemonkey移动应用程序)
我想通过在长时间处理期间显示来让TAniIndicator工作. 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; //基于REMY的答案进行编辑 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.线程完成后,让它通知主线程,然后主线程可以停止动画,并完成线程结果所需的任何其他处理(如果有的话).例如:
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,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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |