我仍在掌控C Sharp和.NET,我正在开发一个应用程序来显示从USB设备不断读取的数据。我有所有的USB代码工作,它每5ms接收一次数据更新。数据由一组传感器值组成,包括50个单元,每个单元有12个传感器。
目前我正在使用ListBox对象来显示50行数据。我将列表框模式设置为OwnerDrawFixed,将我的数据源设置为表示从USB设备读取的数据的对象数据数组(ListBox的每行一个对象),我使用DrawItem事件实际以图形方式绘制每一行列表框请求的列表框(我这样做是为了启用文本着色,格式化,整洁布局等)。
为了让ListBox刷新正在显示的数据,我正在定期调用Invalidate来强制重绘,但这非常慢,即使在低频率(例如1秒更新)也无法接受任何地方闪烁都不可接受接近5ms刷新传感器。
任何人都可以建议更好的方法来更新屏幕上的数据,也许是我不是每次都在绘制所有内容的方法,或者可能是告诉ListBox只重绘一行,如果该行上的数据发生了变化?
我无论如何都不依赖于ListBox,这只是我对.Net框架的不熟悉 - 也许最好的解决方案可能是将所有内容呈现为位图,然后通过单个操作将其blit到屏幕。
我已经阅读了类似的问题,但那里的建议并没有真正帮助...... c# - fast ListBox data update
来自经验丰富的.net开发人员的任何其他建议都非常感谢...
答案 0 :(得分:1)
继承ListBox控件并启用双缓冲是我认为最好的选择。我不知道ListBox如何绘制,但应该减少闪烁。
(如果这不起作用,黑客只会使角落上的一个小矩形无效并希望它能够正确绘制。但这很可能不适用于原始控件集。)
答案 1 :(得分:1)
在不知道自己在做什么的情况下提出建议非常困难。您可以解释一下您的“数据”,“传感器值”和“单位”是什么。通常,图形比显示大量数字列表更适合显示大型数据集。
如果这是某种瞬态数据,如声音强度,您可能会考虑使用VU表显示器,就像在音乐播放器中一样。
如果您要跟踪趋势或更改,请考虑sparkline或图表。
如果您尝试显示数据之间的相关性,请考虑光谱或XY图。
答案 2 :(得分:1)
在WPF中,您可以在beginig中填充ListBox,然后在异步发送数据到布局之后。 如果它可以使用WPF你应该尝试。当你有不断的数据项时,代码是琐碎的。
答案 3 :(得分:1)
对于那些对我有用的解决方案感兴趣的人,无论是快速闪烁还是快速。
我只是使用一个Panel控件在设计视图中表示我的表,然后在我的代码中我有一个方法,每1ms由一个计时器触发(虽然实际上我似乎没有比每16ms更快 - 我猜这可能与显示器的60hz vsync刷新有关,因为我正在进行图形显示。)
我抓住面板的边界,创建一个匹配大小的位图,使用各种图形命令(例如DrawString)将我的数据绘制到位图然后我将生成的位图blit到面板控件。如果我随后在调整面板大小并随后调整我的位图大小时随后调整窗口大小,则效果很好。
这也很快,实际上没有比使用列表控件的前一个慢速/闪烁解决方案更多的工作了,但需要注意的是,不支持选择行等(因为这个应用程序只使用了一个ListBox来显示数据)。
我现在正在认真考虑迷你技术对未来列表框工作的建议,因为这个工作非常好,并且继承ListBox(而不是基于Panel控件)将允许我继承一些行选择的东西等
感谢所有的建议, 富