【问题标题】:TListView.Clear freezes my application,how do i fix it?TListView.Clear 冻结了我的应用程序,我该如何解决?
【发布时间】:2009-08-17 20:11:10
【问题描述】:

我的表单上有一个 ListView:TListview,并且我添加了许多值(大约 25k TListViewItem),它运行得非常快,但是当我调用 Listview.Clear 时,程序冻结了。我用调试器检查它,它赢了不要踩那条线。

我的问题是:我该如何解决我的问题?如果可以在不到一秒的时间内创建这么多项目,为什么要永远删除它们(我等了超过 5 分钟)?

【问题讨论】:

    标签: delphi freeze delphi-2009


    【解决方案1】:

    您是否尝试过将您对 Clear 的调用包含在 BeginUpdate/EndUpdate 块中:

      listview.Items.BeginUpdate;
      try
        listview.Items.Clear;
      finally
        listview.Items.EndUpdate;
      end;
    

    在列表视图(或各种其他控件,例如列表框)中添加/删除项目会为添加/删除的每个项目触发控件的 GUI 更新。特别是对于列表视图,这可能非常昂贵,而且对于 25,000 个项目,开销会很大。

    诚然,5 分钟听起来有点过分,但这是我会尝试的第一件事。

    【讨论】:

      【解决方案2】:

      我会尝试的第一件事是使用 BeginUpdate/EndUpdate 包装您对 Clear 的调用。

        ListView1.Items.BeginUpdate;
        ListView1.Clear;
        ListView1.Items.EndUpdate;
      

      您是否有任何事件附加到 ListView,它们是否在列表被清除时触发?

      【讨论】:

      • 时间花在了某个地方。是否有任何事件触发?我会使用断点或 CodeSite/OutputDebugString 消息来查看。我之所以喜欢 CodeSite,是因为它有一个 IDE 插件,可以将 EnterMethod/ExitMethod 消息放入一个单元中的所有(或选择的)方法中。
      【解决方案3】:

      正如其他人所说的 BeginUpdate .... EndUpdate 将大大提高性能,但是我真的建议您将代码移动到使用 VirtualTreeView。这是一个混合树/ListView,它将在不到一秒的时间内添加多达 1m 个节点(实际上这取决于处理器,但你明白了)。

      一开始学习起来有点困难,但是一旦你习惯了它,你就会发现它“容易”上手。每当我需要 ListView 或 TreeView 中的许多行时,我个人只看 VirtualTreeView。哦,忘了说最重要的是,它是免费的。试试看:http://soft-gems.net/

      【讨论】:

        【解决方案4】:

        约翰,清除的时间应该不会比添加 25k 项的时间长。
        我想知道您是否在它不可见时加载它(自动禁用更新),但在它可见时清除它,每个项目删除都会触发更新。

        【讨论】:

        • 可见。BeginUpdate/EndUpdate 是用户。
        【解决方案5】:

        我不知道我是否应该删除这个问题,我相信它对其他人没有任何用处,但我更愿意至少为你保留一段时间,谁回答了。

        问题是我使用了一个继承自TListView的组件,我认为这不会有问题所以我决定说TListView,但我错了。

        我赞成你所有的答案,请原谅我的无知 - 我是新人。

        【讨论】:

        • 别出汗。那么,您使用的组件是什么?是自家种植的,还是来自第三方的?
        • AlphaControls,它是一个完整的皮肤包,控件继承自borland的vcl,并且它们的skinView(TsSkinView)非常糟糕。
        • 到底是什么问题?他们的清晰代码这么慢吗?为什么会这样?
        • 不,如果您调用 Listbox.clean 并且列表框中有很多项目,它只会冻结。
        • 也许取消引用一个 nil 指针?这导致了我大部分的冻结。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多