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;