更新CListCtrl时MFC应用程序冻结
MFC application freezing while updating CListCtrl
我的MFC应用程序中有一个CListCtrl
。当我从服务器收到一些通知时,需要更新列表。当通知较少时,更新列表的效果非常好,因为列表上的操作较少。但在负载过重的情况下,列表控制会冻结应用程序。
我知道在批量更新的情况下会在单独的线程中更新UI项目,但在这种情况下,我有任何顺序和数量的通知,我需要以这样的方式处理,即我的主线程不会被阻止。
如果之前有人遇到过这个问题,请建议本案的处理方法。
您可以将所有更新放入一个队列中。然后在OnIdle功能中从队列到控件进行有限数量的更新。当GUI消息队列为空时,会调用OnIdle。它可以进行多达20次更新,然后返回。主线程将处理任何GUI输入,完成后将再次调用OnIdle。通过这种方式,您可以延迟和分散更新,同时保持GUI的活力。
我遇到了类似的情况,并使用Timer解决了它。只有当计时器勾选时,ListCtrl才能更新。
旁注:你应该做
SetRedraw(FALSE);
在批量更新之前
和
SetRedraw(TRUE);
之后。
执行批量操作时,不应将控制图形本身置于逐个项目级别。
使用线程。我遇到了同样的问题,我只需要在线程函数中的clistctrl中添加元素就解决了这个问题。也就是说,线程中的POSTMESSAGE((函数应该在我们想要添加元素的时候被调用。MFC应用程序在添加列表控件元素时卡住也可以参考上面的链接来获得一些想法
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- QT应用程序冻结
- QT应用程序接口冻结
- 如何在不冻结线程/应用程序的情况下减慢方法执行速度
- 在线程中复制文件以防止冻结应用程序
- 在C++中读取文件时应用程序冻结
- 监视C++OpenFrameworks应用程序是否冻结或内存泄漏,然后强制退出并重新启动
- 在这个基于对话框的应用程序中,GUI会在几秒钟后冻结
- 故意在 VB.NET 中冻结应用程序
- 如何在不冻结应用程序 1 的情况下从另一个应用程序 1 执行应用程序 2
- 在 android 上向 JNI 类添加私有字段会冻结应用程序
- Qt 应用程序在从 <QUrl>NetworkAccessManager->get() 回调访问 QList<QLlnkedList* >时冻结
- 为什么这个子网类应用程序冻结了
- Qt事件后,长例程冻结了我的应用程序一段时间
- Win32 API:打开对话框窗口后应用程序冻结
- c++ linux时间冻结应用程序
- wxWidgets应用程序在尝试启动新对话框时冻结
- 当添加一个用于监听网络的新线程时,应用程序冻结
- 更新CListCtrl时MFC应用程序冻结
- Linux应用程序在boost::thread::join时冻结