- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 HID 设备,我以大约 200hz-600hz 的频率与之通信,并将数据解释为表示 HID 设备属性的类对象。该类在其属性上实现了 INotifyPropertyChanged,并且由于通信速度的原因,我认为处理队列陷入困境,因为几分钟后控件似乎变得滞后和“帧”。
.net 中是否存在可以帮助解决此类问题的方法,也许是事件处理程序池或某种队列?
不幸的是,没有我的 HID 设备,我不确定我的代码是否对任何人复制有任何用处,但我将包含几个相关的片段来展示我的实现:
public enum DataEvents { onNone = 0, onStatus = 1, onInput = 2, onOutput = 4, onReport = 8};
public class Controller: INotifyPropertyChanged, IDisposable, INotifyDisposed
{
public event PropertyChangedEventHandler PropertyChanged;
public event EventHandler Disposing;
public event EventHandler Disposed;
public event EventHandler ReportReceived;
internal void callPropertyChanged(string PropertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
}
internal void callReportReceived()
{
ReportReceived?.Invoke(this, EventArgs.Empty);
}
public bool Touch1
{
get { return _Touch1; }
private set { if (value != _Touch1) { _Touch1 = value; if (RaiseUpdateEvents.HasFlag(DataEvents.onInput)) callPropertyChanged("Touch1"); } }
}
private bool _Touch1 = false;
//There are many more properties but all of them follow this pattern, and have several different types
}
我的对象是从轮询 HID 设备以获取报告的循环中的 System.Threading.Thread
填充的,HID 设备读取方法是阻塞调用,因此循环不是死循环,并且受限于设备的数据速率,通常为 200hz-600hz。
编辑:值得注意的是,我对 WPF 绑定(bind)特别感兴趣。
最佳答案
在 WPF 中处理近乎实时的系统时(过去 6 年我一直在研究它们),您有几个选择。首先,我将列出一些值得深思的地方:
string.Empty
作为您的属性名称。所以您要问的问题是,用户需要多久查看一次更改?人类的视觉暂留是 1/10 秒,即 100 毫秒。任何比这更频繁的更新都会被浪费,但通常情况下,即使是太频繁了。
每秒一个事件?
在我的场景中,我们确定我们只需要每秒更新一次屏幕上的所有内容。尽管我们每秒最多接收 12 次数据(每个样本 83 毫秒),但我们收集并平均了数据以使其平滑。它让我们的用户更好地了解正在发生的事情。
Update()
方法。INotifyPropertyChanged
以避免 binding memory leak ,但只引发了一个带有 string.Empty
的属性更改事件以导致 UI 刷新最小化对象创建
花在垃圾收集上的每一毫秒都是用户无法与您的应用程序交互的明显时间。每次引发事件时,都必须创建要发送的事件对象。虽然从技术上讲,您可以创建一次事件对象并引发相同的实例,但 WPF 可以在多个地方为您创建对象实例。这些是您需要注意的事项:
DataTemplate
本质上是为每个您想要模板化的对象创建一个新模板。尽可能尝试使用虚拟化,并尽量减少使用。ResourceDictionary
每次您在控件中声明资源字典时,您都在创建一个新实例。最好将所有合并的资源字典放在 App.xaml
中,而不是在不同的用户控件中继续包含相同的字典。特别是如果您在 DataTemplate
ContentPresenter
不是你的 friend 。进一步解释一下,ContentPresenter
将获取您的对象,在控件的 ResourceDictionary
中查找它的类型以找到要实例化的 DataTemplate
为您的数据。当您需要将窗口的特定部分换成另一个控件时,它会很方便,但它确实会带来很大的成本。尽可能减少它的使用。
在后台保持硬件/通信
我们专门设置线程来处理通信和处理需求。这让 UI 保持响应,同时我们可以对数据进行一些 DSP/统计减少。
使用内存分析器
任何时候您需要在显示器上进行近乎实时的更新,您必须特别注意内存的使用。这是我们不得不应对的头号问题。
关于c# - INotifyPropertyChanged 在处理大量数据时陷入困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40284010/
我正在使用 OneWayToSource绑定(bind),它似乎总是将我的源属性设置为空。为什么呢?这给我带来了麻烦,因为我需要源属性中目标属性的值而不是空值。 这是我的代码: MyViewModel
我有一个实例变量属性,它被声明和实例化,如下所示: $self->{properties}{$key1} = $value; 我的理解是这将声明属性字段,并将其设置为包含一个键值对的哈希原语。 我正
我正在尝试检查给定的数字是否是质数。首先采用试分割法。但该程序的行为很奇怪。这是我使用的。 int no; no = Integer.parseInt(jTextField1.getText());
我正在使用 NSUserDefaults使一个对象在多个 UIViewController 之间保持同步UITabbarController 中使用的 s .为此,我正在实现以下 - (void)vi
考虑以下 Java 方法: public Boolean compare(String val1, String val2) { return val1.length() > 0 && val
我有一个问题...假设我有一个包含城市名称的表。像这样: id name 1 Los Angeles 2 Madrid 我有一张用户表: uid username locationid
我无法理解这个问题。该代码非常基本,但它的行为却出乎意料。该代码是例程的简化版本,用于从每日数据库中提取每月第 15 天的数据并将其保存到单独的文件中。哪里有问题 ?第一个 cout 打印输入外部 i
我在 中使用大背景标签,我想制作一个宽度为 960px 的容器 div。我希望容器 div 位于从顶部向下 15px 的位置,我想我必须使用 position:absolute。我的困境是;容器内的
我遇到了一个难题。我有一个 hashedX 字段,它是一个散列值/加盐值,按照惯例,加盐值保存在 mysql 数据库的同一行中。 hashedX saltX ------ ---
类 java.io.Reader 和 java.io.InputStreamReader 都有具有完全相同签名的读取方法 public int read(char[] charbuf, int off
我有一个包含多个 C# 项目的 C# 解决方案。我打算在其中添加日志记录。此日志记录应该在所有项目中可用,并且最好使用带有滚动文件日志的 log4Net。 在上述前提下,我可以想到两种方法。 在解决方
我开始学习Python,目前我非常喜欢它。但是,如果你能帮我回答几个问题,这些问题一直困扰着我,我找不到任何明确的答案: 就语言兼容性而言,Python 的 C 实现(来自 python.org 的主
我正在尝试使用 AVAssetWriter 将 CGImages 写入文件以从图像创建视频。 我已经让它在模拟器上以三种不同的方式成功运行,但在运行 iOS 4.3 的 iPhone 4 上,每种方法
我需要对一个想法进行建模,可以将其分解并考虑如下: 图书详细信息 图书价格 这里的问题是您可以为书籍设置许多价格,并且这些价格可能会发生变化。这是一个例子 图书详细信息: --------------
我有一个表,其中的行包含名为 MySubId 的列。此列中的值可以重复。我想找到 MySubId 值和出现次数最多的 MySubId 值的行数。 我有以下查询: SELECT MySubId, COU
我有两个具有多对多关系的类,因此我在它们之间创建了一个联接表(一个非常经典的示例!) 在java+hibernate中我想知道哪种方式更好?使用hibernate多对多注释在这两个类之间有多对多关系吗
我正在尝试创建一个 Android 应用程序来完成以下任务:它通过短信向一组收件人(存储在数组中的数字)发送初始调查问题。然后,对于收到的每个响应,它都会向该参与者发送该系列中的下一个问题。这是我做过
这里有一个关于 IncludeEventHandler 的有趣问题。 我正在开发一个基于 Spring 的应用程序,该应用程序使用具有单独投资组合站点的不同供应商的速度。我让供应商通过向他们提供存储在
我真的无法理解事件和委托(delegate)的概念。我知道委托(delegate)是持有方法引用的对象,可以调用具有相同返回类型和参数的方法,但事件到底是什么? 如果我需要使用事件来制作一个简单的计算
在我正在处理的一个项目中,我有一个扩展 JFrame 的主类(名为 TrackWin)。在此框架中,我使用 JTabbedPane。 用户可以从菜单栏在 Pane 中创建新选项卡。每当发生这种情况时,
我是一名优秀的程序员,十分优秀!