GUI什么时候会过载?

2024-02-16

假设你是永久在 UI 线程/调度程序上异步调用方法

while (true) {

    uiDispatcher.BeginInvoke(new Action<int, T>(insert_), DispatcherPriority.Normal, new object[] { });
}

每次运行程序时,您都会观察到应用程序的 GUI 在大约 90 秒后开始冻结,因为大量的祈求(时间各不相同,但大致在 1 到 2 分钟之间)。

当这一点发生时,如何准确地确定(测量?)这一点?超载为了尽早阻止它发生?

附录一:

在我的实际程序中,我没有无限循环。我有一个算法,在终止之前会迭代数百次。在每次迭代中,我都会向 WPF 应用程序中的列表控件添加一个字符串。我使用了 while (true) { ... } 构造,因为它最匹配发生的情况。事实上,算法正确终止,所有(数百个)字符串都正确添加到我的列表中,但一段时间后,我失去了使用 GUI 的能力,直到算法终止 - 然后 GUI 再次响应。

附录二:

我的程序的目的是在运行时观察特定的算法。我添加的字符串是日志条目:每次迭代一个日志字符串。我调用这些添加操作的原因是该算法在 UI 线程之外的另一个线程中运行。为了赶上我无法从 UI 线程以外的任何线程进行 UI 操作的事实,我构建了某种 ThreadSafeObservableCollection (但我很确定这段代码不值得发布,因为它会偏离实际问题我认为是UI无法处理方法的重复和快速调用。


这非常简单:当你让用户的眼球超载时,你就做错了。就现代 CPU 核心而言,这种情况发生得相当快,超过每秒 20 次更新,显示的信息就开始变得模糊。电影院利用了这一点,以每秒 24 帧的速度播放电影。

更新速度超过这个速度只是浪费资源。在 UI 线程开始崩溃之前,您仍然有大量的喘息空间。这取决于您要求它完成的工作量,但典型的是 x50 安全裕度。基于Environment.TickCount 的简单计时器将完成工作,当差异 >= 45 毫秒时触发更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GUI什么时候会过载? 的相关文章

随机推荐

  • 在 Silverlight 中的 TextBlock 之后显示一行

    我正在 Silverlight 4 中处理数据表单 并希望按部分对元素进行分组 并为每个元素指定一个标题 标题由一个 TextBlock 和后面的水平线组成 该线一直延伸到表格的边缘 我已经尝试过以下操作 来自此线程 http forums
  • 默认定义的移动构造函数的 noexcept 规则是什么?

    特别是与std vector重要的是类型是noexcept尽可能移动 所以在声明移动构造函数时 default like in struct Object1 Object1 Object1 other default std is noth
  • 在自定义视图类中访问 FragmentManager

    在我的自定义视图中 我有一个运行简单游戏的 Java 类 游戏结束后我想展示我的DialogFragment 但是getFragmentManager 方法似乎未定义 FragmentManager manager getFragmentM
  • 从 Dataflow 将嵌套架构写入 BigQuery (Python)

    我有一个数据流作业要写入 BigQuery 它适用于非嵌套模式 但不适用于嵌套模式 这是我的数据流管道 pipeline options PipelineOptions p beam Pipeline options pipeline op
  • vim 保存后会创建我的文件的副本吗?

    你好呀 使用 vim 每当我进行更改并保存文件时 vim 似乎都会创建一个备份文件 我可以看到这是我进行更改并保存之前的文件 我怎样才能防止这种情况或隐藏这些文件 I type wq保存并退出 是的 最好你应该设置如下 set backup
  • 如何用空格分隔数千[重复]

    这个问题在这里已经有答案了 我想格式化数字 以便每一千都应该用空格分隔 我尝试过的 library magrittr addSpaceSep lt function x x gt as character gt strsplit split
  • 如何在 Google 自定义搜索中指定图像类型

    我正在使用 Google 自定义搜索来获取符合某些条件的图像 我正在从 java 应用程序发起 HTTP Get 请求来调用 Google 自定义搜索 API 请注意我是NOT使用 javascript 或 css 我是NOT开发网站 我能
  • 无法加载资源:服务器通过 Selenium 使用 ChromeDriver Chrome 响应状态为 429(请求过多)和 404(未找到)

    我正在尝试在 python 中使用 selenium 构建一个刮刀 Selenium Webdriver 打开窗口并尝试加载页面但突然停止加载 我可以在本地 Chrome 浏览器中访问相同的链接 以下是我从网络驱动程序获得的错误日志 lev
  • 从 python 有序字典中删除键的复杂性

    从 python 中删除一个键dict or defaultdict在Python中是O 1 操作 正如这里提到的 https www ics uci edu brgallar week8 2 html and here https wik
  • 在 C# 中,将 ulong[64] 转换为 byte[512] 更快吗?

    我有一种方法可以在 for 语句中使用二进制移位将 ulong 转换为字节 但它的时间效率不是很高 有没有办法投射ulong大小为 64 的数组直接转换为大小为 512 的字节数组 这是一段运行数千次的代码 我需要保存每一毫秒 这样我才能节
  • 使用 Python 和 C++ 进行实时处理和回调

    我需要编写代码来执行一些计算相当复杂的实时处理 我想创建一些 Python 类来管理我的所有脚本 并保留用 C 编码的算法的密集部分 以便它们可以尽可能快地运行 我想在 Python 中实例化对象 并让 C 算法通过 Python 中的回调
  • 如何找到包含我的包的堆栈解析器?

    尝试使用最新的堆栈解析器 lts 13 4 安装 hip 不起作用 请参阅我的问题here https stackoverflow com questions 54296951 stack does not resolve dependen
  • 如何将ios 13 UISegmentedControl背景颜色设置为白色?

    我正在尝试在 iOS 13 中为正常状态设置分段控件的背景颜色 我有与此处列出的相同的问题 如何在 iOS 13 中将 UISegmentedControl 的背景颜色设置为白色 https stackoverflow com questi
  • 为什么 bash errexit 在函数调用中的行为不符合预期?

    在 bash 手册页中 它指出 如果管道 可能由单个简单命令组成 请立即退出 括在括号中的子 shell 命令 或执行的命令之一 用大括号括起来的命令列表的一部分 所以我假设函数应该被视为用大括号括起来的命令列表 但是 如果对函数调用应用条
  • UPS 访问许可证号

    我在用马克桑伯恩 UPS 功能 http www marksanborn net php calculating ups shipping rate with php 使用 php 计算 UPS 运费 在此函数中 您必须更改已定义的变量的一
  • 避免在 DispatchQueue 中使用 self

    我想知道如何消除使用self在 的里面DispatchQueue 作为一个好的实践 我们应该使用self仅在init func loadAllClasses DispatchQueue global qos background async
  • 如何避免在java unirest请求中发送Cookie头?

    我注意到使用unirest https github com Mashape unirest java默认情况下 java 库 cookie 在响应中设置后在请求中发送 就像任何浏览器一样 有什么办法可以避免吗 Example public
  • javascript 获取类型/实例名称

    有没有可靠的方法来获取 JavaScript 对象的实例 例如 依靠假 obj getInstance 功能 var T Q W C function var x new T Q W C console log x getInstance
  • 为什么Java不支持<<<运算符

    为什么Java不支持 lt lt lt 无符号左移 运算符 但确实支持 gt gt gt 无符号右移 运算符 Java添加了运算符 gt gt gt 来执行逻辑右移 但是 因为逻辑和算术左移运算是 完全相同的 Java中没有 from Ja
  • GUI什么时候会过载?

    假设你是永久在 UI 线程 调度程序上异步调用方法 while true uiDispatcher BeginInvoke new Action