Как автоматически удалять записи clientdataset, которые не были обновлены

У меня есть clientdataset в ОЗУ без базы данных, которая поддерживает список активных узлов в сети.
Узлы постоянно сообщают, подтверждая, что они активны, таким образом сохраняя набор данных обновленным.
Набор данных отображается в виде dbgrid.

Когда узел перестает сообщать о состоянии, он удаляется из базы данных через несколько секунд бездействия.
Я делаю это, обновляя поле времени ожидания при обновлении поля.
Каждую секунду я перебираю набор данных, удаляя устаревшие записи.

Это работает, но сетка иногда мерцает, когда OnDrawColumnCell обновляет однострочную сетку, чтобы настроить цвета столбцов. Я вызываю DisableControls/EnableControls, но, кажется, есть небольшая задержка, пока OnDrawCell не перерисует сетку, вызывающую мерцание.

Если я отключу итерацию для удаления устаревших записей, мерцание прекратится.
Есть ли лучший способ сделать это?


person AndersJ    schedule 25.03.2016    source источник


Ответы (1)


Способ свести к минимуму мерцание в вашей сетке состоит в том, чтобы использовать «трюк», который использует специальную функцию ClientDataSets, а именно то, что вы можете копировать данные между ними, назначая их свойства Data, как в

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;
person MartynA    schedule 25.03.2016
comment
Нет. Мерцание пропало после перезагрузки. Понятия не имею почему. - person AndersJ; 29.03.2016
comment
Спасибо. Потрудившись написать ответ, приятно знать результат. - person MartynA; 29.03.2016