如何避免应用程序中的闪烁?

时间:2013-01-29 00:59:06

标签: multithreading delphi user-interface iteration flicker

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

我正在对线程中的每个事件做什么(在1毫秒内可能有100个事件),只是递增一个全局整数,来计算迭代次数。然后,我在主表单的标签中显示该号码。可以想象,线程的快速更新将导致闪烁超出控制范围。

所以我想知道的是,当一个线程以更快的速度向其发送事件时,如何避免GUI中的这种快速闪烁?

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

1 个答案:

答案 0 :(得分:4)

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

另一个优点是,线程的性能将不再取决于GUI的更新速度。线程可以触发其事件并仅增加此整数,并继续其工作。请记住,您仍然必须确保您的GUI具有线程保护功能。这是我自己的艺术,我不会介绍并假设你已经知道。

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