写了一个根据cpu使用率 发声的小程序.

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/idning/article/details/83632781

下午烦躁,躺着睡觉

想起来前天看黑客帝国,第6分50秒,neo的电脑发出一种beep,觉得很酷

想弄在一把

 

于是写了个代码:

它会 根据cpu使用率 发声

cpu usage           2秒内发声情况

10%                    . (2声)

20%                    ..(4声)

...

100%                    ....................(20声)

 

于是乎,如果cpu使用率接近100%的话,她就会不停的发声:)

 

 

 

#!/usr/bin/env python2.6
#coding=utf8
#<<neo>>  06:45-6:55 beep ...  ... .....
#if the cpu usage is full ,the beep will not stop. 
# usage:
#    sudo modprobe pcspkr
#    sudo apt-get install beep

import os
import re, time
def beep(frequency, duration=100, repeat=10, delay=10): #100 ms
    cmd = 'beep -f %s -l %s -r %s -d %s' % (frequency,duration, repeat, delay)
    print cmd
    os.system(cmd)

last_all = 0
last_used = 0

def cpu_usage():
    str = file('/proc/stat').read()
    arr = re.split(r'\s+', str)[1:5]
    print arr
    arr = [int(item) for item in arr]
    print arr
    cpu_all = sum(arr)
    cpu_used = sum(arr[0:3])
    usage = 1.0 * (cpu_used- last_used) / (cpu_all - last_all)


    global last_used, last_all
    last_all = cpu_all
    last_used = cpu_used
    print usage
    return usage

for i in range (0, 100000):
    usage = cpu_usage()
    t1 = time.time()
    beep(80, 10, int(usage * 20)+1, 100) #beep for (usage*10+10) times, will tack 1s-2s
    t2 = time.time()
    print t1, t2
    time.sleep(2-(t2-t1))  #2s sub the time used in beep

 

 

展开阅读全文

关于程序CPU使用率的问题

06-06

小弟刚接触编程不到一年,菜鸟一个,靠自学积累了一些编程心得和技术,主攻VC++6。0编写游戏这方面。但一直以来有个问题困饶着我,那就是程序CPU占有率的问题。rnrn如果你编一个空的API程序,从零基础手动添加代码,编好入口函数,消息处理函数后运行,哪怕你只是建一个空窗口,CPU的使用率都是100%。rnrn而如果编一个MFC[EXE]程序,运行时你会看到它的CPU的占有率为0,如果编一个“WIN32 API/一个‘HELLO WORLD’程序”,CPU占有率也是0。rnrn为什么会这样?rnrn我猜应该是消息循环的问题。我看过WIN32 API/一个‘HELLO WORLD’程序”的消息循环代码,这是程序自动生成的代码,和我看的游戏编程资料书上的代码不一样,(各位可以自己去看看)使用这样的代码CPU的占有率为0,而当我把它的代码改为和资料书上一样的时候,CPU的占有率马上升到了100%。rnrn至于MFC[EXE]程序的主函数和消息处理函数我没见过,书上说它们被类封装了,但我找不到。不过MFC程序(自动生成的空窗口)的CPU占有率也是0。rnrn总之,凡是自动生成的程序代码都是正常的,自己填加代码就都不正常,我的电脑就算同时运行《魔兽》和《星际》2款大型游戏CPU占有率都没100%,而运行一个API空窗口程序就变成这样了,大家都应该知道,游戏讲的就是个速度,如果编出的游戏太卡,可玩性就不高了。rnrn而我所有的资料书都不使用系统自动生成的消息循环代码,据说那些代码反应速度太低,无法适应游戏需要。rnrn所以我想问问,有没有一种即能适应游戏需要又不太占用CPU的消息循环代码?我想《魔兽》,《星际》这样的游戏的消息循环代码恐怕都是自己编的而不是使用系统自动生成的消息循环代码吧?rnrn但它们的CPU占用率也不是很过分。到底怎么回事,请大牛回答。rn 论坛

请教一个CPU使用率的问题!

08-16

public class StatDataWorker rn private final PoolWorker[] threads;rn private final LinkedList queue = new LinkedList();rnrn public StatDataWorker(int nThreads) rn threads = new PoolWorker[nThreads];rn for (int i = 0; i < nThreads; i++) rn threads[i] = new PoolWorker();rn threads[i].start();rn rn rnrn public boolean isEmpty() rn return queue.isEmpty();rn rnrn public boolean workOver() rn for (int i = 0; i < threads.length; i++) rn if(!threads[i].saveOk) return false;rn rn return true;rn rnrn public void execute(ParsedData parsedData) rn synchronized(this.queue) rn this.queue.add(parsedData);rn this.queue.notify();rn rn rnrn private class PoolWorker extends Thread rn private ParsedData parsedData = null;rn private boolean saveOk = true;rnrn public void run() rn while (true) rn synchronized(queue) rn while (queue.isEmpty()) rn try rn queue.wait();rn catch (Exception ex) ex.printStackTrace();rn rn try rn this.parsedData = (ParsedData) queue.removeFirst();rn catch (Exception ex) ex.printStackTrace();rn rn try rn this.saveOk = false;rn if(this.parsedData != null) rn StatDataParser _parser = new StatDataParser();rn _parser.parse(this.parsedData);rn _parser.save();rn this.parsedData = null;rn rn catch (Exception ex) rn ex.printStackTrace();rn finally rn this.saveOk = true;rn rn rn rn rnrnrn这是我的一个线程组的源代码,但是当队列没有空闲的情况下,这种写法的CPU使用率就会上升很快,甚至到100%,极其影响服务器的性能,有没有更高的写法能解决CPU使用率的问题,谢谢了。 论坛

没有更多推荐了,返回首页