模拟Windows任务管理器CPU使用率的动态折线图-农夫山泉
Delphi的TCanvas类可以实现各种复杂的图形输出功能,基于近期项目的需求,利用它实现了一个很炫的动态折线图(模拟了资源管理器中CPU使用率的折线图),可以直观地展现出数值的实时变化情况。
这段代码里边有几个核心的地方:
- 首先是为了缓解刷新时画布闪烁,利用了双缓冲的原理;
- 其次结合队列,保证了数据的顺序压入;
- 还有就是一些简单的数组算法。
最终的效果如下:
单元代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,Contnrs;
const
{* 网格间隔 *}
GridSpace = ;
{* 移动步长(能够被间隔整除) *}
MoveStep = ;
{* Y轴最大值(最大刻度) *}
MaxY = ;
type
TForm1 = class(TForm)
Timer1: TTimer;
Button1: TButton;
Image1: TImage;
procedure DrawPL(Shower:TImage);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
{* 网格竖线X坐标数组 *}
GridXPArr: array of Integer;
{* 点坐标数组 *}
PointLst: array of TPoint;
{* 数值队列 *}
YPQueue: TQueue;
{* 数值指针 *}
PYValue: PInteger;
{* 网格偏移量 *}
X: Word;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
YValue:Integer;
begin
Randomize;
YValue := Random();
//新Y坐标点按顺序压入队列
New(PYValue);
PYValue^ := YValue;
YPQueue.Push(PYValue);
end;
procedure TForm1.DrawPL(Shower:TImage);
var
Bit: TBitmap;
i: Integer;
PW,PH: Integer;
YValue:Integer;
begin
//偏移量计算
Inc(X);
if X = GridSpace div MoveStep then
X := ;
//初始化画布(双缓冲)
Bit := TBitmap.Create;
try
PW := Shower.Width;
PH := Shower.Height;
Bit.Width := PW;
Bit.Height := PH;
//初始化网格竖线X坐标数组长度为宽/间隔+1
SetLength(GridXPArr,PW div GridSpace + );
with Bit.Canvas do
begin
Brush.Color := clBlack;
Brush.Style := bsSolid;
Rectangle(,,PW,PH);
Pen.Color := $;
//画网格,根据偏移量实现动态效果
for i := to PW div GridSpace + do
begin
GridXPArr[i] := GridSpace * i - X * MoveStep;
MoveTo(GridXPArr[i],);
LineTo(GridXPArr[i],PH);
end;
for i := to PH div GridSpace do
begin
MoveTo(,GridSpace * i);
LineTo(PW,GridSpace * i);
end;
//画折线
Pen.Color := clLime;
YValue := ;
//如果队列中有新的Y坐标点,则输出
if YPQueue.Count > then
begin
PYValue := YPQueue.Pop;
YValue := PYValue^;
Dispose(PYValue);
end;
//画笔移动到起点位置
MoveTo(,PH);
//每执行一次函数,Y坐标向前移动一位,并连线各个点
for i := to Length(PointLst) - do
begin
PointLst[i].Y := PointLst[i + ].Y;
LineTo(PointLst[i+].X,PointLst[i+].Y);
end;
//按比例更新最后一位坐标点
PointLst[Length(PointLst)-].X := PW;
PointLst[Length(PointLst)-].Y := PH - (YValue * PH div MaxY);
//打印信息(可根据需要调整显示位置和内容)
Brush.Style:=bsClear;
Font.Color:=clYellow;
TextOut(,,'数值:'+inttostr(YValue));
end;
Shower.Canvas.Draw(,,Bit);
finally
Bit.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
begin
YPQueue := TQueue.Create;
//初始化坐标点个数为宽/步长+1
SetLength(PointLst,Image1.Width div MoveStep + );
//初始化坐标点为X轴基线位置
for i := to Length(PointLst) - do
begin
PointLst[i].X := i*MoveStep;
PointLst[i].Y := Image1.Height;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
YPQueue.Free;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
DrawPL(Image1);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
DrawPL(Image1);
end;
end.
模拟Windows任务管理器CPU使用率的动态折线图-农夫山泉的更多相关文章
- achartengine画出动态折线图
achartengine画出动态折线图的效果最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目 ...
- 原生JS实现动态折线图
原生JS实现动态折线图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...
- zabbix监控windows系统CPU使用率
参考网站:https://blog.csdn.net/reblue520/article/details/76287113 Zabbix 自带的模块没有 CPU 使用率(百分比)这个监控项,我们可以通 ...
- 获取Windows操作系统的CPU使用率以及内存使用率
此功能参考了ProcessHacker项目的代码. 声明定义 typedef struct _UINT64_DELTA { ULONG64 Value; ULONG64 Delta; } UINT64 ...
- zabbix 监控windows端cpu使用率百分比
参考网站:http://www.fyluo.com/?post=108 zabbix自带的模版没有CPU使用率(百分比)这个监控项,那么我们可以通过添加计数器的方式实现CPU百分比的监控. 在zabb ...
- 开发成功-cpu-mem监控动态折线图--dom esayui js java
jsp ------------------------------------------------------------------------------------------- ---- ...
- WPF动态折线图
此项目源码下载地址:https://github.com/lizhiqiang0204/WpfDynamicChart 效果图如下: 此项目把折线图制作成了一个控件,在主界面设置好参数直接调用即可,下 ...
- Echarts 动态折线图
<script src="http://echarts.baidu.com/build/dist/echarts-all.js"></script>< ...
- 【转】STM32: 一种计算CPU使用率的方法及其实现原理
1 前言出于性能方面的考虑,有的时候,我们希望知道CPU的使用率为多少,进而判断此CPU的负载情况和对于当前运行环境是否足够“胜任”.本文将介绍一种计算CPU占有率的方法以及其实现原理. 2 移植 ...
随机推荐
- Rocchio算法
一.引子 查询扩展(Query Expansion)是信息检索领域的一个重要话题. 一方面.用户本身可能会出错,他会输入一些错别字,比方把"冯小刚",错写成"冯晓刚&qu ...
- MHA常用命令
.查看ssh登陆是否成功 masterha_check_ssh --conf=/etc/masterha/app1.cnf .查看复制是否建立好 masterha_check_repl --conf= ...
- struts2中配置全局日期类型转换器
1.编写一个类,继承StrutsTypeConverter,实现其中的convertFromString和convertToString方法,该类如下: package me.edu.utils; i ...
- Wireshark 与 Tcpdump
[1]Wireshark 与 Tcpdump Wireshark是Windows下非常容易上手的抓包工具.但在Linux下很难找到一个好用的图形界面抓包工具.还好有Tcpdump.我们可以用Tcpdu ...
- 对无向图的深度优先搜索(DFS)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 如何对无向图进行深度优先搜索 的idea 并用源代码加以实现: 0.2) 本文还引入了 背向边(定义见下文 ...
- Java基础 - 常量与变量
A:常量 内存中的一小块区域,在程序执行过程中,其值不可以发生改变的量称为常量 常量的几种表现形式: a:字符串常量 "HelloWorld" b:整数常量 12 c:小数常量 1 ...
- git克隆远程分支
$ git branch –r 查看远程branch信息 $ git checkout origin/dev检出远程分支 $ git branch -a 查看所有分支,包括本地和远程 可以使用chec ...
- 解决IntelliJ IDEA无法读取配置文件的问题(转发:https://www.cnblogs.com/Sinte-Beuve/p/5730572.html)
最近在学Mybatis,按照视频的讲解在项目的某个包里建立配置文件,然后读取配置文件,但是一直提示异常. 读取配置文件的为官方代码: String resource = "mybatis-c ...
- mysql怎么在已建好的表中添加自增序列
alter table 表明 change id id int not null auto_increment unique;
- R语言set.seed()函数介绍
set.seed(),该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性.如果不设定种子,生成的随机数无法重现.这个函数的主要目的,是让你的模拟能够可重复出现,因为很多时候我们需要取随机数 ...