`
1641606815
  • 浏览: 39053 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

程序控制CPU显示特定曲线

 
阅读更多

 

         程序控制CPU曲线

通过任务管理器我们可以看到现在我们的电脑中CPU以及内存的使用率,CPU的使用是由现在所运行的程序占用。但是我们有没有想过如何自己写一个程序去控制我们的CPU占用率呢?也许这是一个比较困难的事情,因为我们首先想到的是如何从底层去控制CPU。难道它真的有那么困难吗?也许不是,下面让我们去分析如何使我们的CPU显示直线和正弦曲线。

首先,我们需要知道什么是CPU使用率。

   CPU使用率:CPU忙的时间与刷新周期时间的比率。

一:实现CPU显示一条直线

   任务管理器每一秒钟刷新一次,要在这一秒钟内,使CPU的平均使用时间和空闲时间各占50%. 而不是让CPU使用1秒钟,空闲一秒钟。这样的话任务管理器出现的CPU的使用图像会是忽高忽低。windows的调度时间片为10ms,  所以在编写程序的时候就可以让cpu不停的工作10ms, 然后空闲10ms, 空闲操作通过sleep(10)来实现。这样最后任务管理器在刷新CPU占用率的时候就会得到这个一秒钟内的CPU的平均使用率。显示出50%的水平。

   通过空循环,来让cpu保持繁忙的工作状态,通过sleep使cpu空闲。

   机器指令最接近的是汇编语言。

   空的for 循环,换成汇编语言是大概5句,现在的CPU可以在一个时钟周期执行两个机器指令,相当于执行两个汇编语句。

   考虑到我的电脑的主频是1.0G,所以应该是每秒可以执行  1000000000*2/5=400000000 条空循环。 然而不能让机器执行一秒的空循环,应该分时间片的执行。一个时间片10ms, 所以执行空循环应该为4000000次。

   代码如下:

package cpuWaveForm;
/**
 * 控制CPU波形为直线的线程
 * @author Andrew
 *
 */
public class LineFormThread extends Thread{
	int i=0;
	public void run(){
		while(true){
			for(i=0; i<400000000; i++)
				;
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

   上面的程序在我的电脑上运行后通过 资源管理器 查看



 

二:实现CPU显示一条正弦曲线

   若实现CPU显示一条正弦曲线,我们可以写一个程序让CPU工作一段时间,Sleep一段时间以便让CPU显示曲线。

   代码如下:

package cpuWaveForm;
/**
 * 控制波形线程
 * @author Andrew
 *
 */
public class WaveFormThread extends Thread{
	
	final double SPLIT = 0.01;//角度分割
	final int COUNT = (int)(2/SPLIT);
	final double PI = Math.PI;
	final int INTERVAL = 200;
	
	long[] busySpan = new long[COUNT];
	long[] idleSpan = new long[COUNT];
	int half = INTERVAL/2;
	double radian = 0.0;
	
	public void run(){
		for(int i=0; i<COUNT; i++){
			busySpan[i] = (long)(half+(Math.sin(PI*radian)*half));
			idleSpan[i] = INTERVAL - busySpan[i];
			radian+=SPLIT;
		}
		
		long startTime = 0;
		int j=0;
		
		while(true){
			j = j%COUNT;
			startTime = System.currentTimeMillis();
			while(System.currentTimeMillis()-startTime<busySpan[j]);
			try {
				Thread.sleep(idleSpan[j]);
				j++;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

    以上代码在我的电脑上的运行结果为:



 

 

 

  • 大小: 903 Bytes
  • 大小: 1.1 KB
  • 大小: 67.2 KB
  • 大小: 77.9 KB
分享到:
评论

相关推荐

    三菱FX3U的plc画圆程序,程序将圆分为360等份进行插补,才用子程序循环调用的方式,根据这个原理可自行编写多种图形的程序

    3. 程序设计:涉及到PLC中编写程序的技术,用于控制设备的运行和实现特定功能。 4. 插补:在数控机床和机器人等设备中,插补是一种通过控制轴的运动来绘制曲线或曲面的技术。 5. 子程序:在编程中,子程序是一段独立...

    C#程序开发范例宝典(第2版).part08

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

    C#程序开发范例宝典(第2版).part12

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

    C#程序开发范例宝典(第2版).part13

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

    C#程序开发范例宝典(第2版).part02

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

    Delphi开发范例宝典目录

    实例018 以树型显示的程序界面 23 实例019 以XPManifest组件显示界面 24 实例020 动态按钮的窗体界面 25 1.6 特殊形状的窗体 26 实例021 非矩形窗体 26 实例022 建立字体形状窗体 28 1.7 多媒体光盘 ...

    易语言程序免安装版下载

    即,新版支持库可被旧版易语言或易程序使用,旧版支持库也可被新版易语言或易程序使用(只是不支持静态编译)。  静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个...

    多媒体教室

    1、打开控制面板的网络设置项,将 TCP/IP 协议添加到网络组件中(如下图),再选择与网卡绑定的 TCP/IP 协议。 2、在 TCP/IP 属性页中设置正确的 IP 地址,注意不要使 IP 地址重复,设置完成后重新启动计算机。 注:...

    C#.net_经典编程例子400个

    105 实例082 ImageAnimator类显示动画图片 108 实例083 QQ头像列表 110 2.10 控件技术 112 实例084 程序运行时智能增减控件 112 实例085 控制焦点移动 114 实例086 动态创建控件 115...

    gemini3d:电离层流体电动力学模型

    子例程级的文档集描述了各个程序单元的功能,这些文档是通过源代码注释给出的。 GEMINI使用广义的正交曲线坐标,并已通过偶极子和笛卡尔坐标进行了测试。 如果您在使用GEMINI时遇到困难,请打开。 通常,Git ...

Global site tag (gtag.js) - Google Analytics