TVirtualStringTree: данные изменились между событием OnMeasureItem и событием OnGetText

У меня есть массив, содержащий данные, которые будут представлены в TVirtualStringTree. Этот массив является потокобезопасным и блокируемым. И вырос другой нитью.

Моя проблема заключается в том, что когда VST выполняет событие OnMeasureItem для измерения высоты узла, данные, используемые для измерения, могут измениться, когда дело доходит до печати данных с помощью события OnGetText.

Я проверил порядок выполнения событий, и это не очень хорошо для моего дизайна. Сначала он запускает событие OnMeasureItem для всех узлов, которые не инициализированы, а затем начинает вызывать события OnGetText. Я имею в виду, предположим, что у нас есть 3 узла, события будут запускаться в таком порядке:

OnMeasureItem for node 1
OnMeasureItem for node 2
OnMeasureItem for node 3
OnGetText for node 1
OnGetText for node 2
OnGetText for node 3

Но мне нужно что-то вроде этого, чтобы я мог заблокировать:

OnMeasureItem for node 1
OnGetText for node 1

OnMeasureItem for node 2
OnGetText for node 2

OnMeasureItem for node 3
OnGetText for node 3

Как лучше всего поддерживать синхронизацию данных, полученных между OnMeasureItem и OnGetText Мероприятия?

Я не хочу блокировать свой массив во время всех событий OnMeasureItem() и OnGetText().

Спасибо.

Добавлено onTimer:

procedure TMainForm.SyncHexLog;
begin
  HexLog.BeginUpdate;
  Try
    if (HexLog.RootNodeCount <> FirpList.ComOperationCountLagged) then
      begin
          HexLog.RootNodeCount := FirpList.ComOperationCountLagged;

          // measure for fast scrolling
          HexLog.ReInitNode(HexLog.GetLastNoInit(), True);    

          if FAutoScroll then
          begin
            HexLog.ScrollIntoView(HexLog.GetLast, False, False);
          end;
      end;
  Finally
    HexLog.EndUpdate;
  End;
end;
6
задан Ian Boyd 18 July 2018 в 20:42
поделиться