更新CListCtrl时MFC应用程序冻结

MFC application freezing while updating CListCtrl

本文关键字:应用程序 冻结 MFC CListCtrl 更新      更新时间:2023-10-16

我的MFC应用程序中有一个CListCtrl。当我从服务器收到一些通知时,需要更新列表。当通知较少时,更新列表的效果非常好,因为列表上的操作较少。但在负载过重的情况下,列表控制会冻结应用程序。

我知道在批量更新的情况下会在单独的线程中更新UI项目,但在这种情况下,我有任何顺序和数量的通知,我需要以这样的方式处理,即我的主线程不会被阻止。

如果之前有人遇到过这个问题,请建议本案的处理方法。

您可以将所有更新放入一个队列中。然后在OnIdle功能中从队列到控件进行有限数量的更新。当GUI消息队列为空时,会调用OnIdle。它可以进行多达20次更新,然后返回。主线程将处理任何GUI输入,完成后将再次调用OnIdle。通过这种方式,您可以延迟和分散更新,同时保持GUI的活力。

我遇到了类似的情况,并使用Timer解决了它。只有当计时器勾选时,ListCtrl才能更新。

旁注:你应该做

SetRedraw(FALSE);

在批量更新之前

SetRedraw(TRUE);

之后。

执行批量操作时,不应将控制图形本身置于逐个项目级别。

使用线程。我遇到了同样的问题,我只需要在线程函数中的clistctrl中添加元素就解决了这个问题。也就是说,线程中的POSTMESSAGE((函数应该在我们想要添加元素的时候被调用。MFC应用程序在添加列表控件元素时卡住也可以参考上面的链接来获得一些想法