delphi和Application.ProcessMessages

时间:2019-05-09 07:42:50

标签: multithreading delphi responsive

当我的应用程序启动时,它将循环一个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;

0 个答案:

没有答案