SeeK.CS 创作自己的作品

思绪来去匆匆,偶尔在这停留。
随笔 - 10, 文章 - 0, 评论 - 53, 引用 - 0
数据加载中……

[趣味编程]CPU占用率曲线听我指挥

写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:

1.    CPU的占用率固定在50%,为一条直线;

2.    CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100);

3.    CPU的占用率状态是一个正弦曲线。
Google上搜索,可以找到第一题和第3题的C++描述。本人写了个C#版本的,主要用性能计数器
第一题代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;

namespace cpuControl
{
    
public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();
        }


        
private void btnOk_Click(object sender, EventArgs e)
        
{

            
if (float.TryParse(tbNum.Text, out num))
            
{
                Thread thread 
= new Thread(new ThreadStart(Start));
                thread.Start();
            }

            
else
            
{
                MessageBox.Show(
"Please enter legal num");
            }
 
            
        }

        
private void Start()
        
{
             
try
                
{
                    stop 
= false;
                    PerformanceCounter cpuCounter 
= new PerformanceCounter("Processor""% Processor Time""_Total");
                                        
while (!stop)
                    
{
                        
if (cpuCounter.NextValue() > num)
                        
{
                          
//15为时间片轮转时间   
                         Thread.Sleep(15);
                        }

                    }

                }

                
catch (Exception ex)
                
{
                    MessageBox.Show(ex.ToString());
                }

        }

        
float num = 0.0f;
        
bool stop;

        
private void btnStop_Click(object sender, EventArgs e)
        
{
            stop 
= true;
        }

    }

}


关于第2题,本人只实现了把CPU曲线控制在11%,13%,15%,18%,21%,25%,32%,47%,50%,100%这些直线上。用的还是性能计数器。不同点在于Start函数里把sleep的时间设置为变量(15的倍数)
 private void Start()
        
{
             
try
                
{
                    stop 
= false;
                    PerformanceCounter cpuCounter 
= new PerformanceCounter("Processor""% Processor Time""_Total");
                    
int temp = (int)num / 15;
                    temp 
= temp * 15;
                    
while (!stop)
                    
{
                        
if (cpuCounter.NextValue() > 5)
                        
{
                            Thread.Sleep(temp);
                        }

                    }

                }

                
catch (Exception ex)
                
{
                    MessageBox.Show(ex.ToString());
                }

        }

具体的控制在任何百分率直线还不能实现,希望哪为朋友有兴趣可以指点下本人!
第3题还是把人家的C++代码写出来好了。有兴趣的朋友可以转成C#版本的。
#include <math.h>
#include 
<stdlib.h>
#include 
<windows.h>
const double SPLIT=0.01;//windows调度的时间片大概是这个时间 
const int COUNT=200;
const double PI=3.14159265;
const int INTERVAL =300;//控制图像的跨度 
int main(int argc, char *argv[])
{
  DWORD busySpan[COUNT];
  DWORD idleSpan[COUNT];
  
int half =INTERVAL/2;
  
double radian =0.0;
  
int i;
  
for(i=0;i<COUNT;i++)
  
{
       busySpan[i]
=(DWORD)(half+(sin(PI*radian)*half));//函数图像上升的部分的跨度 
       idleSpan[i]=INTERVAL-busySpan[i];//下降部分的 
       radian+=SPLIT;//弧度增加 
       
  }

  DWORD startTime
=0;
  
int j=0;
  
//这段原理和上一个程序一样的 
  while(1)
  
{
     j
=j%COUNT;
     startTime 
= GetTickCount();
     
while((GetTickCount()-startTime)<=busySpan[j])
        ;
     Sleep(idleSpan[j]);
     j
++;
            
  }

  

  
return 0;
}

SIGNATRUE-----------------------------------
龟看上去很慢很慢,而且还有些憨,虽然没有兔子跑的快,但是只要有坚持不懈的毅力,就一定会到达成功的比彼岸.如果自己是龟,就不要试图把自己变成兔子,我就是那只憨龟。

posted on 2008-05-25 23:03 seek 阅读(2240) 评论(15)  编辑 收藏 所属分类: 趣味编程

评论

#1楼    回复  引用    

希望通过努力可以达到兄弟你的水准

。学习了

#2楼    回复  引用  查看    

《编程之美》...
2008-05-26 00:32 | fox23      

#3楼    回复  引用    

不错,编程之美这个问题给的是c++的解决
2008-05-26 00:55 | CppGohan [未注册用户]

#4楼    回复  引用  查看    

编程之美第一个题好像就是这个
C#和C++在语言层上有什么大的区别么?
2008-05-26 08:26 | Da Vinci      

#5楼    回复  引用  查看    

只是换个语言实现啊,我还以为楼主想出新的解法了。。。
2008-05-26 09:11 | Phinecos(洞庭散人)      

#6楼    回复  引用  查看    

第一次看到这个问题.收藏下哈.嘎嘎.
乌龟-->
2008-05-26 10:42 | airwolf2026      

#7楼    回复  引用  查看    

@airwolf2026
《编程之美》这本书的第一题
2008-05-26 11:14 | Phinecos(洞庭散人)      

#8楼    回复  引用    

程序开发的目的,就是为了尽可能的提高效率。
这样的程序,不知有何意义所在。。。
2008-05-26 12:15 | guests [未注册用户]

#9楼    回复  引用  查看    

编程之美
2008-05-26 12:59 | CoderZh      

#10楼    回复  引用    

编程之美
2008-05-26 13:08 | Nicholas.Yuen [未注册用户]

#11楼    回复  引用  查看    

我觉得楼主还是著名出处比较好把
2008-05-26 14:01 | Xwen      

#12楼 [楼主]   回复  引用  查看    

@Phinecos(洞庭散人)
@Xwen
@Nicholas.Yuen
@CoderZh
感谢你们的关注,是编程之美第一题。
2008-05-26 22:57 | seek      

#13楼 [楼主]   回复  引用  查看    

@guests
都已经说了是趣味编程。只写给有兴趣的朋友看
2008-05-26 22:58 | seek      

#14楼    回复  引用    

现在都没有看到双核或者是四核版本的源代码,虽然都是理论上的一些指导。我觉得如果能在双核或者四核上画正弦曲线,除了了解CPU调度本身,还能学到更多的多核编程知识,其中比较重要的是CPU亲缘性,可惜本人愚笨,没写出代码来。另外,还有就是Windows不是Real-Time的系统,所以我觉得这个题,其实和真正的CPU占有率之间,是有一些差异的。
2008-05-27 12:24 | GG99 [未注册用户]

#15楼 [楼主]   回复  引用  查看    

@GG99
是的.这个程序只考虑了单核CPU,至于多核之间的调度,在去年的软件大会上听一个老师讲了点.但是一直没有去实现.
其实我们让CPU曲线成规律显示,只是在同taskmgr的刷新周期(1s)"做斗争",如果要真正的CPU占用率,恐怕用单任务的dos比较好吧:)
2008-05-28 08:53 | seek      

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-25 23:06 编辑过


相关链接: