得到CPU利用率的算法(转载)

#include
#include
#include
#include

static int timer
;

void cb_quit
()
{
gtk_timeout_remove (timer
);
gtk_main_quit
();
}

float
cal_load
(void
)
{
FILE * fp
;
static
long pre_user, pre_nice, pre_system, pre_idle;
//in order to extend easily later, i defined four vars separately
long user, nice, system, idle
;
long d_user, d_nice, d_system, d_idle
;
static
long total
;
float scale
;
char buf[1024
];

if ((
fp = fopen ("/proc/stat", "r")) != NULL
){
while (
fgets (buf, sizeof(buf), fp
)){
if( *
buf == 'c' && *(buf+1) == 'p'
) break;
}
fclose (fp
);
}
else
return
0.0
;

sscanf(buf, "cpu %ld %ld %ld %ld", &user, &nice, &system, &idle
);

// calculate delta value
d_user = user - pre_user
;
d_nice = nice - pre_nice
;
d_system = system - pre_system
;
d_idle = idle - pre_idle
;

total = d_user + d_nice + d_system + d_idle
;
if (
total < 1) total = 1
;
scale = 1.0 / total
;

pre_user = user
;
pre_nice = nice
;
pre_system = system
;
pre_idle = idle
;

return (
d_user + d_nice + d_system) * scale
;
}


gint Repaint (gpointer da
)
{
GtkWidget * drawing_area = (GtkWidget *)da
;
GdkDrawable * drawable = drawing_area->window
;

GdkGC *gc_chart, *gc_text
;
GdkColor color
;

static
unsigned coory[201
];
int da_width, da_height
;
int x
;
float load
;
char buf[30
];

// set chart green
gc_chart = gdk_gc_new (drawing_area->window
);
color.red = 0
;
color.green = 0xffff
;
color.blue = 0
;
gdk_gc_set_rgb_fg_color(gc_chart, &color
);
// set text red
gc_text = gdk_gc_new (drawing_area->window
);
color.red = 0xffff
;
color.green = 0
;
color.blue = 0
;
gdk_gc_set_rgb_fg_color(gc_text, &color
);

// getting size of drawing area
da_width = drawing_area->allocation.width
;
da_height = drawing_area->allocation.height
;
gdk_draw_rectangle (drawable, drawing_area->style->white_gc
,
TRUE
,
0,0
,
da_width
,
da_height
);

// chart cpu load
for (x=0; x<200; x
++)
coory[x] = coory[x+1
];

load = cal_load
();
coory[x] = (int)(load * da_height
);

for(
x=0;x<da_width;x
++){
gdk_draw_line (drawable, gc_chart, x, da_height, x, da_height - coory[x+1
]);
}

// following code for drawing text
sprintf (buf, "Cpu load: %.1f%%", load * 100
);

PangoLayout *layout = gtk_widget_create_pango_layout( da, buf
);
PangoFontDescription *fontdesc = pango_font_description_from_string( "Luxi Mono 12"
);
pango_layout_set_font_description( layout, fontdesc
);
gdk_draw_layout( drawable
,
gc_text
,
5, 5, layout
);
pango_font_description_free( fontdesc
);
g_object_unref( layout
);

g_object_unref( G_OBJECT(gc_chart
) );
g_object_unref( G_OBJECT(gc_text
) );

return
TRUE
;
}

int
main
(int argc, char *argv
[])
{
GtkWidget *window
;
GtkWidget *drawing_area
;

gtk_init (&argc, &argv
);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL
);
gtk_window_set_title (GTK_WINDOW(window), "Cpu Load"
);
drawing_area = gtk_drawing_area_new
();
gtk_container_add (GTK_CONTAINER(window), drawing_area
);

gtk_signal_connect(GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(cb_quit), NULL
);

g_signal_connect( drawing_area, "expose_event"
,
G_CALLBACK(Repaint), NULL
);

gtk_drawing_area_size (GTK_DRAWING_AREA(drawing_area), 200, 100
);

gtk_widget_show (drawing_area
);
gtk_widget_show(window
);
timer = gtk_timeout_add (1000, Repaint, (gpointer) drawing_area
);
gtk_main
();

return
0
;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值