Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示我的数据以实现快速流体更新的最有效方法_C#_.net_Performance_Listbox - Fatal编程技术网

C# 显示我的数据以实现快速流体更新的最有效方法

C# 显示我的数据以实现快速流体更新的最有效方法,c#,.net,performance,listbox,C#,.net,Performance,Listbox,我仍然在学习C Sharp和.NET,我正在开发一个应用程序来显示从USB设备不断读取的数据。我有所有的USB代码工作,它是接收数据更新每5毫秒。数据由一组多个单位的传感器值组成,例如50个单位,每个单位12个传感器 目前,我使用一个ListBox对象来显示50行数据。我将listbox模式设置为OwnerDrawFixed,将我的datasource设置为表示从USB设备读取的数据的对象的数据数组(listbox的每行一个对象),并使用DrawItem事件按照listbox的请求实际以图形方式

我仍然在学习C Sharp和.NET,我正在开发一个应用程序来显示从USB设备不断读取的数据。我有所有的USB代码工作,它是接收数据更新每5毫秒。数据由一组多个单位的传感器值组成,例如50个单位,每个单位12个传感器

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

为了让列表框刷新正在显示的数据,我定期调用Invalidate来强制它重新绘制,但这是非常缓慢的,即使在低频率下(如1秒更新),也会出现令人无法接受的闪烁,更不用说在传感器刷新5ms的附近了

有人能提出一种更好的方法来更新屏幕上的数据吗?也许是一种我不是每次都画所有东西的方法,或者是一种告诉列表框只重绘一行的方法,也许是在该行上的数据发生变化的情况下

无论如何,我并不局限于列表框,这只是因为我对.Net框架不熟悉——也许最好的解决方案是将所有内容渲染成位图,然后通过一个动作将其显示在屏幕上

我已经读过一个类似的问题,但是里面的建议并没有真正的帮助。。。


经验丰富的.net开发人员的任何其他建议都非常感谢……

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


(如果这不起作用,一个黑客就是只使角落里的一个小矩形无效,并希望它能正确绘制。不过,这很可能对原始控件集不起作用。)

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


(如果这不起作用,黑客就是只使角落里的一个小矩形无效,并希望它能正确绘制。不过,这很可能对原始控件集不起作用。)

在不知道自己在做什么的情况下,很难提出建议。你可以解释你的“数据”、“传感器值”和“单位”是什么通常,图形比大量的数字列表更适合显示大型数据集

如果这是一种短暂的数据,比如声音强度,你可以考虑VU表的显示,比如音乐播放器。

如果你试图跟踪趋势或变化,考虑一个或图。


如果你想展示数据之间的相关性,考虑一个谱或XY图。

很难在不知道你正在做什么的情况下做一个推荐。你可以解释你的“数据”、“传感器值”和“单位”。一般来说,图形比大的数字列表更能显示大数据集。

如果这是一种短暂的数据,比如声音强度,你可以考虑VU表的显示,比如音乐播放器。

如果你试图跟踪趋势或变化,考虑一个或图。


如果你想显示数据之间的相关性,请考虑一个谱或XY图。

在WPF中,你可以在Buffig中填充ListBox,然后在同步发送数据到布局之后。


如果可以使用WPF,您应该尝试。当您不断地删除数据项时,代码是微不足道的。

在WPF中,您可以在开始和结束时填充列表框,然后将数据发送到布局。
如果可以使用WPF,您应该试试。当您不断地删除数据项时,代码是微不足道的。

对于那些对我的解决方案感兴趣的人来说,它既不会闪烁又快速

我只是简单地使用一个面板控件在设计视图中表示我的表,然后在我的代码中我有一个每1ms由计时器触发的方法(尽管实际上我似乎不能比每16ms快一次-我猜这可能与监视器的60hz vsync刷新有关,因为我正在做一个图形blit)

我抓取面板的边界,创建一个匹配大小的位图,使用各种图形命令(如DrawString)将数据绘制到位图,然后将生成的位图blit到面板控件。如果随后在调整面板大小时调整窗口大小,并相应调整位图大小,则效果很好

这也可以快速工作,事实上,与以前使用列表控件的慢速/闪烁解决方案相比,没有更多的工作,但是需要注意的是,不支持选择行等(因为此应用程序仅使用列表框来显示数据)

我现在正在认真考虑mini Tech对未来listbox工作的建议,因为这项工作非常好,listbox的子类化(而不是基于面板控件)将允许我继承一些行选择内容等

谢谢你的建议,
Rich

适用于那些对我的解决方案感兴趣的人,它既稳定又快速

我只是简单地使用一个面板控件在设计视图中表示我的表,然后在我的代码中我有一个每1ms由计时器触发的方法(尽管实际上我似乎不能比每16ms快一次-我猜这可能与监视器的60hz vsync刷新有关,因为我正在做一个图形blit)

我抓取面板的边界,创建一个匹配大小的位图,使用各种图形命令(如DrawString)将数据绘制到位图,然后将生成的位图blit到面板控件