最有效的方式来显示我的数据快速流体更新

本文关键字:更新 数据 我的 有效 方式 显示 | 更新日期: 2023-09-27 18:08:58

我仍然在掌握C Sharp和。net,我正在开发一个应用程序来显示从USB设备持续读取的数据。我有所有的USB代码工作,它正在接收每5毫秒的数据更新。数据由若干单位的一组传感器值组成,例如50个单位,每个单位有12个传感器。

目前我使用一个ListBox对象来显示50行数据。我将列表框模式设置为OwnerDrawFixed,并将我的数据源设置为代表从USB设备读取数据的对象的数据数组(列表框的每行一个对象),我使用DrawItem事件实际以图形方式绘制列表框的每一行,如列表框所要求的(我这样做是为了使文本着色,格式化,整齐布局等)。

为了让ListBox刷新正在显示的数据,我定期调用Invalidate来强制它重新绘制,但这是非常慢的,即使在低频率下也会闪烁,例如1秒更新,更不用说获得接近5ms的传感器刷新。

谁能建议一个更好的方法来更新屏幕上的数据,也许一个我不是每次都画的一切,或者一种方法告诉ListBox只重画单行也许如果行上的数据已经改变?

无论如何,我并不依赖于ListBox,这只是我对。net框架的不熟悉-也许最好的解决方案可能是将所有内容渲染为位图,然后在单个动作中将其blit到屏幕上。

我已经读过一个类似的问题,但是里面的建议并没有真正帮助…c# - ListBox数据快速更新

最有效的方式来显示我的数据快速流体更新

继承ListBox控件并启用双缓冲是,我认为,你最好的选择。我不知道ListBox是如何绘制的,但这应该可以减少闪烁。

(如果这不起作用,一种方法是只使角上的一个小矩形无效,并希望它能正常绘制。但是,这很可能不适用于原始控件集。)

如果不知道自己在做什么,就很难提出建议。你可能会解释你的"数据"、"传感器值"answers"单位"是什么。一般来说,图形更适合显示大型数据集,而不是庞大的数字列表。

如果这是某种瞬态数据,比如声强,你可能会考虑使用像音乐播放器那样的vu表显示。

如果你试图跟踪趋势或变化,可以考虑使用火花线或图形。

如果您试图显示数据之间的相关性,请考虑频谱或XY图。

在WPF中,您可以在开始时填充ListBox,然后将数据异步发送到布局。如果可能的话,您应该尝试使用WPF。当你有固定数量的数据项时,代码是微不足道的。

对于那些对解决方案感兴趣的人来说,这对我来说既可靠又快速。

我只是使用面板控件来表示我的表在设计视图中,然后在我的代码中,我有一个方法,这是由计时器触发每1ms(虽然在现实中,我似乎不能得到它比每16ms更快-我猜这可能是链接到60hz垂直同步刷新显示器,因为我正在做一个图形blit)。

我抓住面板的边界,创建一个匹配大小的位图,使用各种图形命令(如DrawString)将数据绘制到位图上,然后将结果位图blit到面板控件上。如果我随后在面板调整大小的同时调整窗口大小,我的位图也相应地调整大小,这就可以很好地工作了。

这也工作得很快,实际上并不比以前使用列表控件的慢/闪烁解决方案多,但是要注意的是,不支持选择行等(因为这个应用程序只使用ListBox来显示数据)。

我现在正在认真考虑对未来列表框工作的迷你技术建议,因为这个工作围绕工作得非常好,并且子类化列表框(而不是基于面板控件)将允许我继承一些行选择的东西等。

感谢所有的建议,丰富的