1

ネットワーク経由で収集されたデータが取り込まれる TListView がありますすべてのデータを収集するには約 50 ミリ秒かかり、リストに追加するには約 5 秒かかります。私の最初の推測では、追加のたびに再描画されているか、そのようなものでした。TListViewをできるだけ早く更新するにはどうすればよいですか?

列と項目はすべてコードで追加されます。

リストの項目でBeginUpdateEndUpdateを使用してみましたが、大きな違いはありませんでした。リストに追加された約 2000 のエントリがあります。

4

2 に答える 2

1

実際のコードを見なければ、更新がそれほど遅い理由を確実に知る方法はありません。ただし、特にリストアイテムが多い場合に速度が問題になる場合は、TListView代わりに仮想モードにして(OwnerDataプロパティをtrueに設定)、ステータス情報をそれ自体ではなく他の場所に保存する必要がありTListViewます(2000アイテムが多い)非仮想ListViewが処理するオーバーヘッドの)。次に、必要に応じてListViewInvalidate()またはUpdateItems()メソッドを呼び出して再描画をトリガーし、イベントを使用して、要求されたときにOnDataステータスデータを提供します。TListView例えば:

struct MyStatusInfo
{
    String Status;
    ...
};

MyStatusInfo StatusItems[2000];

__fastcall TForm1::TForm1(TComponent *Owner)
    : TForm(Owner)
{
    ...
    ListView1->Items->Count = 2000;  // you don't use Add() with a virtual ListView
    ...
}

void __fastcalll TForm1::UpdateStatus(int Index, const String &Status, ...)
{
    MyStatusInfo &Info = StatusItems[Item->Index];
    Info.Status = Status;
    ...
    ListView1->UpdateItems(Index, Index);
}

void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
{
    MyStatusInfo &Info = StatusItems[Item->Index];
    Item->Caption = Info.Status;
    ...
}
于 2012-12-12T19:51:13.070 に答える
0

BeginUpdate は役に立たなかったので、それが役立つかどうかはわかりませんが、試してみる価値はあります:

1) Enabled = false の状態で入力してから、有効にします

2) TListItems を構築してみて、それを TListView の Items プロパティに直接割り当てます。

于 2012-12-12T15:37:00.920 に答える