如果ListView中有许多从线程添加的记录,则窗口会冻结

use*_*ser 1 delphi multithreading listview delphi-xe

我的程序在分离的线程上执行"繁重"任务(搜索文件并查找签名).每个任务都使用PostMessage来调用将记录添加到ListView的过程.

问题是当ListView(经常)显示许多记录时,我的窗口将冻结.似乎我的程序正在尖叫以请求Application.ProcessMessages.只有Progressbar仍在继续.操作完成后,一切恢复正常.

如果我删除添加记录的操作,我的程序的操作将顺利运行.

你有什么主意吗?

Lie*_*ers 8

我们曾经达到了可以将多少消息发布到消息队列的限制.很可能你也达到了这个限制.

来自MSDN

每个消息队列的发布消息数限制为10,000.这个限制应该足够大.如果您的应用程序超出限制,则应重新设计它以避免消耗这么多系统资源.

来自最佳同步是无同步

PostMessage到主GUI线程的问题是你可以"饱和"主GUI消息泵,并干扰WM_TIMER和WM_PAINT消息(如果消息队列为空,则仅调度这些消息,PostMessage意味着队列可能永远不会另外,输入队列中有一条名义限制为10,000条消息;之后,PostMessage将丢弃该消息并返回FALSE.此外,即使没有命中10,000限制,即使是几百条消息也意味着用户看到键盘和鼠标输入响应不佳,这是一种令人无法接受的情况.

  • @user,Synchronize很可能是你可以尝试的最糟糕的"解决方案".对我们有用的是在发布消息时简单地减少.最后,需要知道的所有主要线程都有"一些"变化.例如,每隔1000条消息发布一次(messagecount mod 1000 = 0)就可以完成它并且仍然可以顺利进行.在Offcourse,确保您的上一个通知发布. (2认同)