求助:winform窗体控件多,屏幕闪的问题。

问题描述

如题,求助,情况如下:我的一个winform窗体,用于监控设备的实时状态。上面有比较多的线,上千条,label四百个左右,用于实时显示各个监控点的状态。现在的问题是,当切换窗体或者label值变化的时候,可能是窗体重绘,整个屏幕就会闪,严重影响性能。用了双缓冲,没有一点用。this.SetStyle(ControlStyles.UserPaint,true);this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);//禁止擦除背景.this.SetStyle(ControlStyles.DoubleBuffer,true);//双缓冲this.UpdateStyles();不知道各位大虾遇到此类情况是如何解决的,跪求。

解决方案

解决方案二:
用DirectX或者System.Drawing来画。。不要堆砌控件。
解决方案三:
控件太多卡是正常的,400多个能同时在一个页面里显示么?如果不能可以想办法每次只绘制显示区域内的控件,其余的不显示
解决方案四:
dodducs整个图本来是1.5*1.5个屏幕绘制好的,原来只是切换页面的时候稍微有点闪,感官上没什么影响。但考虑原来情况不能一下看完整的状态,需要拖动滚动条,所以就重新布局到一个屏幕以内,结果就闪的相当明显了。CGabriel的建议很好,但是上面有上千条直线,如果用System.Drawing来画,太难定位和布局了。
解决方案五:
使用局部刷新技术,只刷新需要的部分
解决方案六:
这种情况很正常,我做ERP的界面的时候也会有同样情况。能不能用集合存储窗体,再根据情况来取值。
解决方案七:
重新设计,监控100个探头,也没必要把100个屏幕都显示在一个界面上吧.象地铁那样,只显示4个,5秒换一批.就好了.
解决方案八:
ReZHENNIUBILE这是一个设备的控制系统,一百多个开关,上百个流量传感器、压力传感器等,要绘制到一起显示当前设备的状态。之前就是一个屏幕显示不完,需要滚动条才重新压缩布局显示到一个屏幕的。xuexiaodong2009的建议很好,但是刷新的时候没有局部之分,设备上每个监控点的状态,每秒钟都可能发生变化的。所以局部刷新可能是行不通的。还有问题就是,上面的线是不动的,但是每次也跟着整个屏幕重绘。用System.Drawing来画的话,线多,太难定位和布局了。也不知道显示效果如何。
解决方案九:
好像以前有人問過了,當然會閃的,用DirectX增強技術
解决方案十:
有多少个开关,就开多少个线程,使用线程先获得各种状态数据,如果数据跟上一个数据一样,则不刷新.否则,就刷新.这样,就会减轻界面的刷新负担.----------------------------那个双缓冲,我感觉没啥用,呵呵
解决方案十一:
用选项卡分组一下吧那个双缓冲没有什么作用!
解决方案十二:
引用7楼guoja的回复:

ReZHENNIUBILE这是一个设备的控制系统,一百多个开关,上百个流量传感器、压力传感器等,要绘制到一起显示当前设备的状态。之前就是一个屏幕显示不完,需要滚动条才重新压缩布局显示到一个屏幕的。xuexiaodong2009的建议很好,但是刷新的时候没有局部之分,设备上每个监控点的状态,每秒钟都可能发生变化的。所以局部刷新可能是行不通的。还有问题就是,上面的线是不动的,但是每次也跟着整个屏幕重绘。用System.Drawing来画的话,线多,太难定位和布局了。也不知道显示效果如何。

问题是既然线是不动的,为什么也要跟着重绘呢,上千条线,这个问题解决了,可能闪屏的问题会改善很多
解决方案十三:
this.SuspendLayout();this.ResumeLayout(false);

把要操作的控件把在这两句代码中间,同时考虑使用Invoke。
解决方案十四:
还有问题就是,上面的线是不动的,但是每次也跟着整个屏幕重绘。用System.Drawing来画的话,线多,太难定位和布局了。也不知道显示效果如何。如果一直不动,是不是可以考虑使用图片代替线条呢?不知道你怎么刷新的?Invalidate(Rectangle)使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。(继承自Control。)尽量减少刷新的频率和范围
解决方案十五:
this.SuspendLayout();code......this.ResumeLayout(false);这样还是不行的。我也想过用图片来代替上面的线条,线条虽然是不动的,但是要根据状态来改变各个线条的颜色,做成图片的话,这部分功能就不能用了。
解决方案:
引用12楼lovesongforever的回复:

C#codethis.SuspendLayout();this.ResumeLayout(false);把要操作的控件把在这两句代码中间,同时考虑使用Invoke。

解决方案:
还有你重绘屏幕的间隔是多长时间?如果数据正常,1秒足够了,采集的其他数据可以作为监测而不刷新,如果出现异常立即处理就行了
解决方案:
C#codethis.SuspendLayout();this.ResumeLayout(false);把要操作的控件把在这两句代码中间,同时考虑使用Invoke。试过了不行的。还有你重绘屏幕的间隔是多长时间?如果数据正常,1秒足够了,采集的其他数据可以作为监测而不刷新,如果出现异常立即处理就行了上面的值每秒更新一次,整个屏幕大面积的控件都要更新值或者状态。值更新后,屏幕自然就重绘了。特别是上面的线条,感觉是一部分一部分出来的。
解决方案:
会不会不是屏幕重绘的问题,而是有哪一项任务消耗CPU资源太多而影响了屏幕的重绘
解决方案:
你理一理,看哪一个模块任务比较重

时间: 2024-12-20 20:05:47

求助:winform窗体控件多,屏幕闪的问题。的相关文章

c#winform窗体控件工具栏

问题描述 c#winform窗体控件工具栏 解决方案 ToolStrip,你最好能够找本C#教程或者PDF教程读一下,这些控件vs都自带的.

如何在多线程中调用winform窗体控件

由于 Windows 窗体控件本质上不是线程安全的.因此如果有两个或多个线程适度操作某一控件的状态(set value),则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用和死锁的情况.于是在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException  本文用一个很简单的示例来讲解这个问题(在窗体上放一个TextBox和一个Button,点击Button后,在新建的线程中设置T

C#线程访问winform窗体控件

参考地址:http://www.cnblogs.com/jason-liu-blogs/archive/2012/09/08/2677008.html 添加: public Form() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } 就可以了

求助!请教窗体控件渐进显示

问题描述 C#窗体控件如何做到渐进显示,例如从上到下,从左到右等.拜托各位了,刚接触C#,求学中,请大家帮忙! 解决方案 解决方案二:刚刚接触都想搞窗体弹出方式的重绘,佩服佩服解决方案三:改变窗体坐标.解决方案四:我问的是控件的渐进显示啊.不是窗体

Winform分页控件使用详细介绍

自从上篇随笔<Winform分页控件最新版本发布,并提供基于DotNetBar界面的版本>介绍了最新版本的分页控件,并提供下载使用后,很多人对分页控件非常感兴趣(毕竟Winform数据分页是很常见的),并关注该分页控件应该如何使用,其实分页控件在之前很多篇随笔中断断续续都有介绍,为了使大家对分页控件有个系统的认识,本篇详细介绍分页控件的一些属性设置及相关使用注意事项,使大家对该分页控件有一个更深的了解.跟系统的认识,以便在相关的项目开发中熟练使用.分页控件效果     实现步骤  1.在Vis

从在 Internet Explorer 中使用 Windows 窗体控件开始谈Smart Client

client|window|控件 首先引用Microsoft Windows 窗体快速入门教程上的文章"在 Internet Explorer 中使用 Windows 窗体控件":(如果引用的一些信息无法正常显示,请直接上面上的链接查看) 本主题描述如何在 Internet Explorer (IE) 内成功地执行 Windows 窗体控件.IE 内的 Windows 窗体控件无需用户提示即可激活,它不要求注册,而且利用公共语言运行库 (CLR) 代码访问安全性. 在 Internet

在IE浏览器中使用Windows窗体控件(一)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(一) 作者::Thiru Thangarathinam 翻译:秋枫 引言 在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来实现一些胖客户端才具有的功能.不过现在开发者可以很容易的通过Microsoft.NET Framework来简洁和安全的建立对象,并且方便的在IE浏览器中切入使用.通过在IE浏览器中创建Windows窗体控件,开发者可以实现丰富的web客户端.在这篇文章中,我们将会知道怎样创建Windo

在IE浏览器中使用Windows窗体控件(二)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(二) 作者::Thiru Thangarathinam 翻译:秋枫 通过windows窗体控件访问Web Service 窗体控件一个重要优点就是你可以通过它在客户端实现丰富的用户信息.比如说,你可以通过窗体控件对Web服务的访问从而在IE中显示而不需要重新刷新该页面.为了演示这点,我们先来创建一个Web服务,接着再来演示怎样通过窗体控件调用Web服务. 创建Web service 我们创建一个 Visual C# Asp.n

在IE浏览器中使用Windows窗体控件(三)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(三) 作者::Thiru Thangarathinam 翻译:秋枫 调试Windows窗体控件 要调试窗体控件,你需要按照下面步骤进行. 1.打开浏览器并请求包含窗体控件的那个Html页面. 2.打开visual Studio.Net同时选择工具->调试进程就会显示下面的对话框. 在这个进程对话框中,选择IEXPLORE.EXE 点击附加按钮.当你点击附加按钮时会跳出一个对话框提示你选择要调试的程序类型.我们选择了Common