当我的应用程序启动时,它将循环一个clientdataset并更新一个字段。在该循环内,我调用Application.ProcessMessages
,以便应用程序能够响应,并且进度条也可以动画。
当线程完成(同步)时,我也会遇到此循环,因此在更新内部数据时用户将无法执行任何操作。再次显示带有适当标签的进度条。
在多台计算机上,效果很好。在特定计算机上,Application.ProcessMessages
会执行所有操作,除了处理循环外,会导致一切卡住。
不确定这台计算机有什么特别之处,我知道ProcessMessages是不好的做法,但不确定如何克服这一点。仅用于简单循环的线程听起来太多,而其他情况已经是线程(尽管已同步)。
对于要设置动画的进度条(位于专用窗体中),我添加了frm.Refresh,虽然可以解决问题,但整个应用程序没有响应,这意味着将其最小化后,我无法还原窗口回来。
这里的任何建议将不胜感激。 谢谢
编辑:示例代码
frm.cxLabel2.Caption := 'Updating income...';
frm.pProgress.Properties.Marquee := FALSE;
frm.pProgress.Position := 0;
frm.pProgress.Properties.Max := frmMain.cds.RecordCount;
frmMain.cds.First;
while not frmMain.cds.Eof do
begin
frm.pProgress.Position := frmMain.cds.RecNo;
frm.Refresh; // Application.ProcessMessages;
frmMain.cds.Edit;
frmMain.cdsincome.AsFloat := frmMain.CalculateIncome(frmMain.cdsItemName.AsString,frmMain.cdstax.AsFloat);
frmMain.cds.Post;
frmMain.cds.Next;
end;