Windows – 如何使用DoEvents()而不是“邪恶”?
一个简单的
search for
DoEvents 带来了很多结果,基本上是:
一般引用的原因是: 重新入侵问题 但是一些值得注意的Win32功能(如TrackPopupMenu和DoDragDrop)执行自己的消息处理来保持UI的响应,就像DoEvents一样。 他们是如何做到的呢?他们如何避免DoEvents引用的问题? (还是他们?)
DoEvents()是危险的。但我敢打赌你每天做很多危险的事情。就在昨天,我引出了一些爆炸装置(未来读者:请注意相对于某个美国假期的原始发布日期)。小心,我们有时会考虑到危险。当然,这意味着知道和理解危险是什么:
>再入场问题。这里有两个危险: >这里的一部分问题与调用堆栈有关。如果您在循环中调用.DoEvents()来处理使用DoEvents()的消息等等,那么您将获得一个非常深入的调用堆栈。过多使用DoEvents()很容易,并且意外填满您的调用堆栈,从而导致StackOverflow异常。如果你只在一两个地方使用.DoEvents(),你可能还好。如果这是您长时间运行的过程中遇到的第一个工具,您可以在这里轻松找到自己的麻烦。即使一个用在错误的地方也可以使用户强制执行一个stackoverflow异常(有时只需按住Enter键),这可能是一个安全问题。 >性能问题。 DoEvents()可以给出多线程的错觉,但它不是真正的mutlithreading。这至少有三个真正的危险: >当您调用DoEvents()时,您可以将现有线程控制回消息泵。消息泵可能反过来控制别的东西,还有一些可能需要一些时间。结果是,您的原始操作可能需要更长的时间才能完成,如果它在一个线程本身,从来没有产生控制,绝对比它需要更长的时间。 >可用性问题。这些是由于不妥善处理其他危险而产生的副作用。只要您在其他地方看到适当的地方,这里没有什么新鲜事。 如果你能确定你是所有这些事情的话,那就去吧。但是,如果DoEvents()是第一个解决UI响应/更新问题的地方,那么您可能不会正确地解释所有这些问题。如果不是你看的第一个地方,还有足够的其他选项,我会质疑你如何使用它来考虑DoEvents()。 现实情况是,大多数时候,至少在.Net世界里,一个BackgroundWorker的组件几乎是一样简单,至少一旦你完成了一两次,它将以安全的方式完成这项工作。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-server-2003 – 加入计算机域时,“指定的域不存在或
- 清除Windows上的所有和仅持久(静态)路由
- Windows Azure:将网站从www重定向到非www
- 为什么覆盖WPF Window.OnRender方法无法绘制到屏幕?
- Windows – Adob??e Air:隐藏启动本机窗口
- wpf – 为什么在Window.Resources项目上设置x:Name不起作用
- windows – git clone挂起“检查连接”
- botframework – Microsoft Bot Framework Client sdk
- Qt:父/子链中有多个窗口,父对象不会关闭子窗口?
- windows-server-2008 – 混合网络2003/2008文件共享问题