【实时】DevExpress内存监视

摘要:
DevExpress的安装不是问题。事实上,没有办法使用DevExpress。我在网上找到了许多图形控件,但没有一个是我想要的。虽然DevExpress规模相对较大,但它有很大的优势,即功能强大。对于DevExpress的安装,我写了一篇文章,“DevExpress控件安装和中文使用教程”。你可以参考它。

前言

  在做项目的时候,我们有时候需要检测项目的内存占用情况,有时候是检测内存泄露~,有时候是查看某段代码执行前后的内存对比,以方便找出问题并以解决。

内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。-百度百科

  前几天做项目的时候就遇到这种情况,项目是winform开发,大数据压缩、解压和绑定的时候,内存飙升的很快。虽然通过Windows任务管理器可以查看到进程的内存使用情况,但只是数值的体现,想要的效果:

【实时】DevExpress内存监视第1张

  这种波线图可以直观的体现出程序的CPU使用情况,找了一下关于内存的,虽然在资源监视器中有内存的使用情况,但是并不是我想要的,也在网上找了下内存监视程序,找了大半天也没找到。

  自己动手,丰衣足食。

DevExpress安装问题

  这里在多说句,其实用DevExpress也是没办法,网上找了好多图形控件,但都不是我想要的,虽然DevExpress比较大,但是大有大的好处,那就是功能很强大。

  关于DevExpress的安装写了一篇文章《DevExpress控件安装、汉化使用教程》,大家可以参考下。

  在安装完之后记得要安装DevExpress.Patch.13.1.5.exe这个补丁包,不然开发的程序每次都会弹出:

【实时】DevExpress内存监视第2张

  还有一点就是安装完卸载的时候,一定要正确的卸载,有次我正在卸载的时候强制关机了,重新开机安装的时候,就会出现这种情况:

【实时】DevExpress内存监视第3张

  虽然程序已经卸载,但还是提示模块已经安装,程序已经被破坏了,然后我就用软媒 - Win7优化大师(我认为是比较好的清理工具),深度清理了下垃圾文件和注册表,但是发现还是不行,肯定注册表文件没有清理干净,有点想要重装系统的冲动,单仅仅是冲动,没有行动,毕竟重装完系统要那么多的软件要重新安装,没办法就手动清理注册表吧,搜寻“DevExpress”有关的注册表,那不是一般的多啊,还有些是GUID生成的:

【实时】DevExpress内存监视第4张

  一条一条的删啊,也不知道删了多少条,但我记得肯定没删完,我就是试了下重装,发现可以了。

  做事要有耐心。

实现

  以上废话说的有点多,关于DevExpress的教程真的很少(中文),因为DevExpress太庞大了,只能通过DevExpress提供的示例程序去学习,实现上面波形图在DevExpress中有个控件叫SwiftPlotDiagram,位置在DevExpress.XtraCharts.v13.1.dll,使用DevExpress实现图形程序必须包含在ChartControl控件下。

  我们先看下设计器:

【实时】DevExpress内存监视第5张

  除去实现内存监控这个程序,我们只考虑波形图,要实现一般有几个基本元素:

  •  坐标(SeriesPoint)
  •  时间刻度(TimeInterval)
  •  走势线(RegressionLine)

RegressionLine翻译是回归线的意思,就是一个总的大致走势方向,我称作走势线,只是个叫法不同。

  上面元素中坐标最重要,明白了元素我们看下代码:

复制代码
 1         private const int interval = 20;
 2         private double value = 10.0;
 3         RegressionLine Regression { get { return GetRegressionLine(Series); } }
 4         private int TimeInterval
 5         {
 6             get
 7             {
 8                 return Convert.ToInt32(nud_Interval.Value);
 9             }
10         }
11         private Series Series
12         {
13             get
14             {
15                 return chartControl.Series.Count > 0 ? chartControl.Series[0] : null;
16             }
17         }
复制代码

  上面几个字段就不解释了,value是纵坐标的值,也就是内存值,Series英文翻译是串联的意思,这边表示的是坐标组成曲线的集合,因为这边我们就画了一个曲线图所以是Series[0]。

复制代码
 1         //获取进程
 2         private void getProcess()
 3         {
 4             foreach (Process item in Process.GetProcesses())
 5             {
 6                 cb_Process.Items.Add(item.ProcessName);
 7             }
 8             cb_Process.SelectedIndex = 0;
 9         }
10         //获取下一个坐标值
11         private double CalculateNextValue(double value)
12         {
13             Process process = Process.GetProcessesByName(cb_Process.Text)[0];
14             return process.PrivateMemorySize64/1024.0;
15         }
复制代码

  getProcess()方法是获取本地线程集合填充到下拉列表中,CalculateNextValue()方法是更新纵坐标的值,也就是内存值,这个方法在timer事件中调用。

  我们看下timer事件代码:

复制代码
 1         //timer事件
 2         private void timer_Tick(object sender, EventArgs e)
 3         {
 4             if (Series == null )
 5             {
 6                 return;
 7             }
 8             var argument = DateTime.Now;
 9             //一个刻度需要画的坐标
10             var pointsToUpdate = new SeriesPoint[interval];
11             for (var i = 0; i < interval; i++)
12             {
13                 pointsToUpdate[i] = new SeriesPoint(argument, value);
14                 argument = argument.AddMilliseconds(1);
15                 UpdateValues();
16             }
17             //添加坐标
18             AddPoints(Series, pointsToUpdate);
19             var minDate = argument.AddSeconds(-TimeInterval);
20             //重新设置X轴MinMaxValues
21             var diagram = chartControl.Diagram as SwiftPlotDiagram;
22             if (diagram != null && diagram.AxisX.DateTimeScaleOptions.MeasureUnit == DateTimeMeasureUnit.Millisecond)
23             {
24                 diagram.AxisX.Range.SetMinMaxValues(minDate, argument); 
25             }
26         }
复制代码

  timer事件主要做个三个工作,一是根据设置好的interval获取每个刻度的内存值,然后添加到Points数组中,interval的值越大,画出的波线图越精细,下面就是把Points数组的坐标值加到Series中,最后把X轴的最大小值设置下,以实现动态的效果,需要注意的是:

1         diagram.AxisX.Range.SetMinMaxValues(minDate, argument);

  这句代码的意思不是设置整个X轴的最大小值,而是这个刻度下的最大小值,大家可以把这段代码注释下看下效果就知道了,可以看出时间刻度是一样的,并没有清除叠加。

【实时】DevExpress内存监视第12张

  关于X轴-时间轴,我们可以在设计其中可以设置:

1          swiftPlotDiagram1.AxisX.DateTimeScaleOptions.GridAlignment = DevExpress.XtraCharts.DateTimeGridAlignment.Millisecond;
2          swiftPlotDiagram1.AxisX.DateTimeScaleOptions.MeasureUnit = DevExpress.XtraCharts.DateTimeMeasureUnit.Millisecond;
3          swiftPlotDiagram1.AxisX.Label.DateTimeOptions.Format = DevExpress.XtraCharts.DateTimeFormat.Custom;
4          swiftPlotDiagram1.AxisX.Label.DateTimeOptions.FormatString = "mm:ss";
5          series1.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.DateTime;

  上面是设置X轴-时间刻度为毫秒,下面是设置显示的格式,最下面代码的意思是设置曲线画图刻度的格式是DateTime格式,也就是上面SeriesPoint的argument。

  下面关于图标标注的设置就是图形上面的标注PrivateMemory,因为所有的图形控件都集成在ChartControl中,只要找到设置起来很方便:

复制代码
 1         this.chartControl.Legend.AlignmentHorizontal = DevExpress.XtraCharts.LegendAlignmentHorizontal.Left;
 2         this.chartControl.Legend.AlignmentVertical = DevExpress.XtraCharts.LegendAlignmentVertical.TopOutside;
 3         this.chartControl.Legend.Direction = DevExpress.XtraCharts.LegendDirection.LeftToRight;
 4         this.chartControl.Legend.Visible = true;
 5         series1.Name = "PrivateMemory";
 6         regressionLine1.Name = "Regression Line";
 7         swiftPlotSeriesView1.Indicators.AddRange(new DevExpress.XtraCharts.Indicator[] {
 8         regressionLine1});
 9         series1.View = swiftPlotSeriesView1;
10         this.chartControl.SeriesSerializable = new DevExpress.XtraCharts.Series[] {
11      series1};
复制代码

  上面设置标注显示格式,设置名称只要设置series的name属性就行,不需要重新绑定,因为Legend是集成到chartControl中的,设置好后把series添加到chartControl中就可以显示了,如果要显示多个线性,只要再添加series即可。

  关于刻度标示的设置:

1          swiftPlotDiagram1.AxisX.Title.Text = "时间";
2          swiftPlotDiagram1.AxisX.Title.Visible = true;            
3          swiftPlotDiagram1.AxisY.Title.Text = "内存大小(KB)";
4          swiftPlotDiagram1.AxisY.Title.Visible = true;

  最后关于走势线RegressionLine,因为是集成在chartControl,用的时候只要指示需要体现的series,添加到Indicators集合中就可以了,看下代码:

复制代码
 1         regressionLine1.Name = "Regression Line";
 2         swiftPlotSeriesView1.Indicators.AddRange(new DevExpress.XtraCharts.Indicator[] {
 3         regressionLine1});
 4 
 5         //获取走势线
 6         private static RegressionLine GetRegressionLine(Series series)
 7         {
 8             if (series != null)
 9             {
10                 var swiftPlotView = series.View as SwiftPlotSeriesView;
11                 if (swiftPlotView != null)
12                 {
13                     foreach (Indicator indicator in swiftPlotView.Indicators)
14                     {
15                         var regressionLine = indicator as RegressionLine;
16                         if (regressionLine != null)
17                         {
18                             return regressionLine;
19                         }
20                     }
21                 }
22             }
23             return null;
24         }
复制代码

  说了那么多,我们看下最后实现的效果(20毫秒,录制的比较卡):

【实时】DevExpress内存监视第17张

  完整代码:

【实时】DevExpress内存监视第18张 View Code

  示例程序下载:MemoryMonitor.rar

后记

  swiftPlotDiagram只是chartControl的冰山一角,chartControl只是DevExpress的冰山一角,DevExpress只是扩展控件的冰山一角,扩展控件只是。。。

http://www.paymob.cn

https://admin.paymob.cn

免责声明:文章转载自《【实时】DevExpress内存监视》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇form表单select联动(转)[Android_Ubuntu编译错误]ubuntu13.10编译错误全部解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DevExpress随笔系列

DevExpress版本14.1 作为一个小型企业的信息部,怎么可能专职配一名美工呢! 那么问题来了,如何开发出高大上的软件给领导和业务部门使用那,答案是使用别人家的界面组件。 本系列随笔是我在使用DevExpress过程中随手记录的一些心得体会,欢迎批评指正:) DexExpress(1): ASPxPopupControl随笔 DevExpress(2...

Winform中实现更改DevExpress的RadioGroup的选项时更改其他控件(TextEdit、ColorPickEdit)的值

场景 Winform中实现读取xml配置文件并动态配置ZedGraph的RadioGroup的选项: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100540708 在上面实现了将RadioGroup的选项根据配置文件动态配置后, 比如这里有三个选项,在更改选项时会对其他的控件的值进行...

DevExpress GridView 整理(转)

DevExpress GridView 那些事儿 1:去除 GridView 头上的 "Drag a column header here to group by that column" --> 点击 Run Designer -> 找到:OptionView ->将 ShowGroupPanel : 设置为 false ; 2:如何...

Devexpress实现自适应布局

总结了一下题主最近使用DXP空间设计自适应布局的经验。好的,让我们开始 一、设计一个simplebutton水平居中并且高度可调整 1、拖入一个PanelControl并设置其Dock为Bottom 2、拖入LayoutControl到PanelControl中并设置其Dock为Fill 3、LayoutControl上右键,选择CreateEmptySp...

WPF界面开发:DevExpress WPF在GridControl中固定行时处理时刻

DevExpress广泛应用于ECM企业内容管理、 成本管控、进程监督、生产调度,在企业/政务信息化管理中占据一席重要之地。通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件的衍伸产品,还是以数据为中心的商业智能...

【DevExpress】4、在WinForm里用反射模拟Web里面的超链接功能

这几个月一直在用DevExpress做公司的一个工具,布局模仿DevExpress控件包里面的一个示例(如上图),用Dev的朋友们应该对这个很熟悉吧#^_^#,从里面学到了许多东西,控件的基本使用,以及一些好的设计理念,哈哈,也不知道算不算理念,反正对我自己挺有帮助的,这里就总结了下,对自己是个巩固,如果有不恰当的地方,请大家不要吝惜手中的砖头。 布局...