如果没有后台进程,我可以避免“无响应”消息

时间:2016-11-21 20:34:47

标签: c# windows multithreading winforms

我有一个专门的计算机应用程序,可调节和偶尔的视觉反馈到主窗体上的组件。我的主窗体还有一个滑块,用于控制用户如何在计算速度和UI响应速度之间取得平衡。我知道如何创建后台工作线程,但这不是我的意图,因为允许UI线程连续处理消息会使我的计算速度降低几个数量级。我想故意阻止滑块控制的UI线程。在一定数量的循环之后,我允许UI在我的代码中使用Application.DoEvents()指令处理消息,此时处理所有挂起的UI更新。我允许循环由滑块控制。在UI释放之前的50个循环给出了一个很好的视觉响应时间,没有可感知的UI延迟,并且在UI释放之前的2000个循环在UI赶上之前大约需要15秒,但是极大地提高了计算速度。

话虽如此,当滑块设置为阻止UI时,有没有办法避免释放模式程序从“无响应”到常规模式来回循环?

感谢。

感谢您的所有回复。 谢谢你的建议。计算与表单上的几个UI组件之间存在大量交互。我已经尝试使用基于Invoke委托的模板的后台线程,这些模板具有扩展方法,如互联网上其他地方所建议的那样,并且以您建议的方式工作,但是使计算变得如此缓慢以至于变得荒谬。作为一种解决方法,我可以将component.visible变为false,并且只会让进度条实时更新,并且速度几乎与我的滑块最大化速度相同,但坦率地说,仅仅观察进度是没有意义的每隔10秒左右就会在主视觉组件上看到更新。我正在推动很多像素,这是我出于IP原因可以在此应用程序上提供的所有信息。所以我的问题仍然存在,我可以吃蛋糕吗?我可以关闭那些使我的应用程序表单闪烁的窗口消息吗?我有解决方法,我都不喜欢这些解决方案,并且没有直接解决问题的评论对我没用。感谢您的耐心和理解。

2 个答案:

答案 0 :(得分:2)

您应该将任何繁重的计算作为后台线程实现,并将进度/结果与UI同步。

通过这种方式,您不会永远阻止UI,并且当用户可以在UI上看到他们的进度时,将会进行繁重的计算。

此外,避免在非常小的时间间隔内在UI上显示进度。刷新1,2或甚至5秒就足够了!

我会看看其他问答:Invoke in Windows Forms。它已经过时但对你来说应该是一个好的开始。

答案 1 :(得分:0)

我自己找到了解决方案。感谢大家,感谢您的专业知识。

我现在正在对不可见的图像进行所有像素写入。这允许计算引擎通过与UI交互而不受阻碍地以最大速度前进。我经常将图像的克隆分配给可见组件,它提供实时反馈,但不以牺牲计算速度为代价。

能够在1000处硬编码UI更新并摆脱滑块。 UI更新每3-5秒发生一次。好的。

好多了。