2011-01-12 73 views
1

[遗憾的是英语不是我的母语。]如何在已更新的情况下跳过UI更新?

所以,我有一个UI和1名工人在另一个线程,工人将调用用户界面更新()中随机频率, 所以有可能是一个很多Update()被调用到UI。但是,如果真的有多个Update(),那么只有最新的一个是有意义的,但我无法跳过这两者之间的。

所以我想

  1. “检测是否有更新()持续的,如果是的话,就挂起1次更多更新()”

  2. “检查是否已经有1更更新()待定,那么就没有必要更挂起” 更新()

之前,但我不知道什么是做到这一点的最好办法。我想肯定有人遇到过这样的问题。谷歌搜索只是给了我一些无关的结果。因此,我正在寻找一些模式或最佳做法或搜索关于此的条款或建议或建议。

非常感谢你

+0

@Brian:感谢您删除这两个标签。当我看到你打我时,我也会这样做。作为标签,“慢”和“跳”并不是真的有用。 – 2011-01-12 16:19:28

回答

1

好像你需要一个长度为1的更新请求队列。

产生UpdateRequests到队列并放弃它们,如果队列已满......然后从另一个线程中消耗它们,实际上是最终更新调用到主线程。

0

如果您始终要保证UI线程检索到的值是推送的最后一个值,请考虑您在UI线程和后台线程之间共享的数据的堆栈结构。您仍然需要锁定共享数据,以确保UI线程不会收到“过时”更新。

下面是在C#中的Stack类的引用:
http://msdn.microsoft.com/en-us/library/system.collections.stack.aspx

根据文档:

线程安全
公共静态(共享 在Visual Basic)的这个成员类型 是线程安全的。任何实例成员 不保证是线程安全的。

为保证 堆栈的线程安全,所有操作必须通过 同步方法返回的包装完成 。

枚举整个集合是 本质上不是线程安全的 过程。即使集合是 同步,其他线程仍然可以 修改集合,这将导致枚举器引发 引发异常。 要在枚举中保证线程安全,您可以在整个 枚举期间锁定 集合,或者捕获由其他 线程所做更改产生的异常 。

编辑:
Jorge是右手也有Queue类,可能更适合:
http://msdn.microsoft.com/en-us/library/system.collections.queue.aspx

2

目前尚不清楚你使用的是什么样的类库。但是,调用Update()基本上是错误的。绘制用户界面是一项低优先级任务,只有在没有更重要的需要照顾时才能完成。

正确的事情是调用Invalidate()。你可以多次调用它,它不能'备份'。当UI线程准备好并且愿意时,它将绘制用户界面。如果更改发生得更快,那么UI线程可以跟上然后没有损害,中间漆不会发生。

这是一般你需要照顾的其他东西。每秒拍摄脚部并调用数百次非常简单。这是毫无意义的,人类无法感知到速度的变化。每秒四十次是充足的,看起来和电影中的电影一样流畅。实际上,你应该少用。

+0

这是假设他所指的Update()是.NET UI的“更新”,而不是他所具有的某个业务特定的更新,但我认为它是一种安全的赌注。 – GWLlosa 2011-01-12 17:16:37

相关问题