3

这是每个开发人员不时面临的一个非常常见的问题,当视觉更新可能如此快速和快速以至于导致表单内容闪烁时。我目前正在使用一个线程来搜索文件并触发一个事件到它的调用(主 VCL)线程来报告每个搜索结果。如果您曾经使用过FindFirst/ FindNext,或者为此执行过非常快速且快速的迭代的任何大型循环,那么您就会知道在每次小迭代上更新 GUI 都非常繁重,并且几乎违背了线程的目的,因为线程随后变得依赖于 GUI 更新的速度(在线程内的每次迭代中)。

我对来自线程的每个事件(1 毫秒内可能有 100 个事件)所做的只是增加一个全局整数,以计算迭代次数。然后,我在主窗体的标签中显示该数字。可以想象,来自线程的快速更新会导致闪烁无法控制。

所以我想知道的是,当线程向它提供事件的速度快于它能够更新的速度时,如何避免 GUI 中的这种快速闪烁?

注意:我使用的是 VCL 样式,所以闪烁变得更糟。

4

1 回答 1

4

这确实是一个常见问题,并不总是由线程引起,而是由任何需要更新 GUI 的循环引起,同时循环的迭代速度比 GUI 能够更新的速度快。快速简便的解决方案是使用计时器来更新您的 GUI。每当循环触发更新时,不要立即更新 GUI。相反,为每个可能需要更新的东西(显示计数的标签)设置一个全局变量(如全局迭代计数),然后让计时器进行 GUI 更新。将计时器的间隔设置为 100-200 毫秒。这样,您可以控制 GUI 更新的频率与您设置的计时器间隔一样频繁。

另一个优点是线程的性能将不再取决于 GUI 更新的速度。线程可以触发它的事件并且只增加这个整数,然后继续它的工作。请记住,您仍然必须确保对 GUI 进行线程保护。这本身就是一门艺术,我不会介绍它,假设你已经知道了。

注意:您需要执行的 GUI 更新越多,您可能需要调整计时器的间隔就越高。

于 2013-01-29T00:59:05.593 回答