如何自动删除未更新的clientdataset记录

How to auto delete clientdataset records that have not been updated

我在 RAM 中有一个 clientdataset 无数据库,用于维护网络中活动节点的列表。
节点不断报告确认它们还活着,从而保持数据集更新。
数据集显示在 dbgrid 中。

当一个节点停止报告状态时,它将在几秒钟不活动后从数据库中删除。
我通过在更新字段时更新超时字段来做到这一点。
我每秒遍历数据集删除过时的记录。

这可行,但当 OnDrawColumnCell 刷新单行网格以自定义列颜色时,网格有时会闪烁。我调用 DisableControls/EnableControls,但似乎有一个小延迟,直到 OnDrawCell 重绘导致闪烁的网格。

如果我禁用删除过时记录的迭代,闪烁就会停止。
有更好的方法吗?

一种最小化网格中闪烁的方法是使用 'trick',它利用了 ClientDataSets 的一个特殊功能,即您可以通过分配它们的数据属性在它们之间复制数据,如

cdsDestination.Data := cdsSource.Data;

所以您可以做的是拥有两个 CDS,一个仅用于显示目的,另一个用于处理您的网络节点。这意味着对副本 CDS 的更改保持在绝对最低限度,并且您可以使用源 CDS 做几乎任何您想做的事情,只要您喜欢就可以(当然,只要您能得到它)在下一次目标 CDS 更新之前完成)。像这样:

const
  NodeCount = 1000;

procedure TForm1.DoDataUpdate;
begin
  //  do something to CDS1's data here
  cdsCopy.Data := CDS1.Data;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  CDS1.CreateDataSet;
  for i := 1 to NodeCount do
    CDS1.InsertRecord([i, Now]);
  CDS1.First;
  DBGrid1.DataSource := DataSource1;
  DataSource1.DataSet := cdsCopy;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  DoDataUpdate;
end;