如果我有新的 UI 更新,如何停止预定的 UI 更新?

     2023-04-12     221

关键词:

【中文标题】如果我有新的 UI 更新,如何停止预定的 UI 更新?【英文标题】:How do I stop scheduled UI updates if I get new ones? 【发布时间】:2019-10-21 03:16:54 【问题描述】:

所以,我有一个可调整大小的窗口,它根据它计算的实时值绘制一个图表。如果我使窗口更大,它会重绘和缩放所有内容,当图形达到新的 maxY 和 maxX 时,也会使用这些作为参考点来确定其他点的位置。这工作正常,但如果我调整窗口大小,并且安排了很多更新,窗口调整大小很好,但图表模仿了它应该在几秒钟前(最多 4 秒)做的事情。

如果我理解正确的话,每次我调用被阻塞的 UI 线程并给他新的坐标来绘制时,它都会完成当前的坐标,然后继续下一个坐标。我明白你为什么想要这样,但由于图表或多或少地不断缩放,无论如何它都会在每次更新时自行删除,所以我会节省相当多的处理能力和运行时间,如果我能完成所有当前任务并跳过所有累积的任务一直到最新的,因为存储的反正已经过时了

有没有办法做到这一点?

我想到了 3 件可能有效的事情,其中​​只有第 3 件,我知道会有效,或者说是可能的,即使速度很慢:

// (1) If there is a way to check if the UI thread is busy, I could just not send 
// a new request to draw another line
if(!uithread.busy)

    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
                                                           new Action(() => this.DrawGraph(new List<List<Coordinates>>  CoordinateListA, CoordinateListB )));

// (2) As soon as UI thread finishes the current task, it jumps to the newest one
// (3) In my opinion the ugliest solution, I check how long the last drawing took and 
// don't send any draw-requests in that time. I will just wait that certain time and
// just then send him the newest results to draw and measure how long that took

如果没有更好的解决方案,我想我会选择(3),但由于我希望有另一种方法,所以我想问问这里的其他人是否有类似的问题。

【问题讨论】:

通过传递 CancellationToken 使 DrawGraph 可中止。 我是否会在收到新请求时取消每个排队的抽奖请求? 好吧,首先,无论如何,我会在调整大小时暂停绘制图表。你画的频率是多少? 我同意@Fildor 的建议。在这种情况下,人们通常会做的是显示一个缓存的图像,它会随着用户调整可视区域的大小而调整大小以适应。位图调整大小可以比重新生成缓存图像更有效,并且通常可以轻松跟上用户输入。然后,一旦用户完成调整大小,返回并开始创建新的缓存图像。如果用户在停止之前的调整大小操作后立即再次开始调整大小,您可能会也可能不会觉得取消该操作很有价值。 @Fildor 大约每秒 200 次 initiallu,每次重绘都会减少 【参考方案1】:

所以我修好了。我的架构保存了所有日志,所以我不需要保存坐标,如果我需要新值,我可以在每次需要新坐标时从日志中计算它们。像这样:

// beginning of the class
private bool _isDrawing = false;

if (!_graphIsDrawing)

    _graphIsDrawing = true;
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
                                               new Action(() => this.DrawGraph(new List<List<Coordinates>>  CoordinateListA, CoordinateListB , scalingFactors, canvasSize)));
//I need to invoke, since I am working with multiple threads here. Else it
//would be enough to just call 'this.DrawGraph(...)'


///////////

public void DrawGraph(List<List<Coordinates>> listOfGraphs, float[] scalingFactor, int[] canvasSize)

    lock (_graphDrawLock)
    
        this._AlgorithmRuntimeViewA.DrawGraph(listOfGraphs[0], scalingFactor, canvasSize);
        this._AlgorithmRuntimeViewB.DrawGraph(listOfGraphs[1], scalingFactor, canvasSize);
        _graphIsDrawing = false;
    

在这里我再次锁定它,所以不是两个线程同时绘制破坏一切。最后,我再次将 _graphIsDrawing 设置为 false,因此我可以再次调用它。

【讨论】:

在我的 UI 中选择图像如何停止我的 Web API?

...,在我的AngularUI中,我有一个新的部分来选择一个文件。如果我点击它,然后选择一个文件,或者在打开的对话框中点击取消,我的 查看详情

WPF:如果 UI 元素不可见,则停止绑定

】WPF:如果UI元素不可见,则停止绑定【英文标题】:WPF:StopBindingifaUIelementisnotvisible【发布时间】:2011-01-1501:49:15【问题描述】:如果元素当前不可见,我可以延迟绑定ui元素吗?有时我有一个包含一些隐藏/最小化元素的表单,... 查看详情

客户端热更新框架之ui热更框架设计(下)

...,最后附带源码工程的下载链接,供广大学员参考研究。如果大家有什么不明白的地方,欢迎大家在评论区进行讨论。  1:首先基于笔者以前设计 查看详情

如何在 C# 中按下停止按钮来停止耗时过长的 UI 线程 [关闭]

...indows窗体,其中包含(除其他外)一个开始和停止按钮。如果Startbutton_click代码花费的时间太长,我想按下停止按钮(或其他一些事件 查看详情

从服务更新 UI 比意图更有效的方法?

...Service,它是一个示例VOIP客户端,因此它会侦听SIP消息,如果收到一条消息,它会启动一个带有UI组件的Activity屏幕。然后以下SIP消息确定Activity在屏幕上显示的内容。例 查看详情

如何在新的 iTunes Connect UI 中上传应用更新

】如何在新的iTunesConnectUI中上传应用更新【英文标题】:HowdoIuploadtheappupdatesinthenewiTunesConnectUI【发布时间】:2011-01-1623:23:43【问题描述】:我只是要更新我的iPhone应用程序。我添加了“此版本中的新增功能”信息并更新了所有内... 查看详情

刷新网格后剑道ui网格可分页大小发生变化

...的剑道网格。在我的搜索表单中,我有提交和重置按钮。如果进行某些搜索,则网格将使用搜索到的过滤器数据源进行更新,然后单击重置网格将使用新的数据源进行刷新。我的问题是没有重置如果我将页面大小值10更改为2 查看详情

如何阻止WordPress插件更新?

...infromupdating?【发布时间】:2017-08-0619:12:40【问题描述】:我有一个WordPress插件,我根据自己的需要进行了修改。当我将它推送到站点时,它会在有新的更新覆盖我的更改时自动更新。我想断开它与WordPress插件目录的连接,以便它... 查看详情

Xcode 7 UI 测试 XCUIElementQuery 随机未正确更新

...】:我有一个解除警报的UI测试,检查警报是否已解除(如果没有,它会再次尝试解除),然后继续进行其余的测试。大多数情况下,测试都顺利通过,但有时看似随机(尽管更常见的是在硬件较旧的机器 查看详情

Jquery ui“恢复”模态表单上的位置取消

...2013-06-0423:33:16【问题描述】:我有一组可以拖动的元素(如果需要,可以拖放),当用户停止拖动操作时,我需要一个表单出现(通过拖动:停止或放下)来更新移动的对象,如果用户取消模态表单,我希望该项目“恢复”到用... 查看详情

如何从线程更新 UI?

...题描述】:我在androidapp中使用线程时遇到了一些问题。我有Activity1.java,它有一些从sqllite数据库获取数据并将其显示在活动上的功能。我有一种方法Load()填充一些微调器静态和一些来自数据库。第二个微调器值取决于第一个下... 查看详情

添加实体时如何防止添加相关实体?

...henaddanentity?【发布时间】:2012-08-1806:09:38【问题描述】:我有两个实体:具有多对多关系的类别和产品。如何防止UI程序员在想要添加产品时添加类别?事实上,我希望UI程序员只添加产品并设置预定义的类别,而不能为产品添... 查看详情

客户端热更新框架之ui热更框架设计(上)

...题是必然的,所以”在线更新”就成了家常便饭与必然。如果你要求必须整体重新 查看详情

如何构建androidmvvm应用框架

...就是我们在Activity不写业务逻辑和业务数据相关的代码,更新UI通过数据绑定实现,尽量在ViewModel里面做(更新绑定的数据源即可),Activity要做的事就是初始化一些控件(如控件的颜色,添加RecyclerView的分割线),View层可以提... 查看详情

JavaFX 中的多线程会挂起 UI

...将进行一些处理并随着它的进行更新UI(例如进度条)。如果单击停止按钮,我希望线程终止。我尝试使用从文档中收集到的javafx.concurren 查看详情

数据更改时如何更新 UI?

...datahaschanged?【发布时间】:2012-03-1819:38:46【问题描述】:我有一系列可由用户检索、编辑和保存的XML文件。我的意图是允许多个用户同时编辑这些文件。这些XML文件的许多部分都与浏览器UI中显示的内容相关,例如显示了&lt;na... 查看详情

如何在 python 程序的简单 UI 中显示实时图形?

...apythonprogram?【发布时间】:2011-05-0623:51:03【问题描述】:我有一个复杂的算法来更新存储在数组中的3个直方图。我想调试我的算法,所以我想在用户界面中将数组显示为直方图。最简单的方法是什么。(快速应用开发比优化代... 查看详情

向ui发送参数并使用java/vaadin更新ui

初始位置如下图所示。我有一个创建对话框的主UI。在此对话框中,将生成一些属性。我想在单击按钮时将属性传输到主UI,然后关闭对话框。然后,我想刷新UI,以便使用新的属性/参数更新UI。关闭对话框是这样的:this.getParent(... 查看详情