linux下GTK程式設計:顯示CPU使用率,記憶體使用率,網速。
阿新 • • 發佈:2018-10-31
StartOS 5.1版GNOME核心linux用了一段時間後,一直想視窗程式設計,QT最先搭建好,QT入門做了一個系統資訊,重灌系統後發現不能運行了,要安裝QT環境才能執行,於是想做一種低依賴的系統級程式設計,因為StartOS已經停止更新了,千辛萬苦第三次才成功搭建GTK環境,結合C語言對QT原始碼進行移植,並做了一些改進,最終視窗介面是一樣的。
#include <gtk/gtk.h>
#include<string.h>GtkWidget* window;
GtkWidget* label;
long long i=0,tt=0,tt0=0,idle=0,idle0=0,r1=0,t1=0,r0=0,t0=0,mu=0,mt=0,mf=0;
char *uptime(char *hms)
{
int ss,h,m,s;
float tt,it;
FILE *fp;
fp=fopen("/proc/uptime","r");
fscanf(fp,"%f %f",&tt,&it);
fclose(fp);
ss=(int)tt;
h=ss/3600;
m=ss%3600/60;
s=ss%3600%60;
sprintf(hms,"%d:%02d:%02d",h,m,s);
return hms;
}
meminfo()
{
FILE *fp;
char cmt[40],cmf[40],a[40],b[40];
fp=fopen("/proc/meminfo","r");
fgets(cmt,sizeof(cmt),fp);
fgets(cmf,sizeof(cmf),fp);
fclose(fp);
sscanf(cmt,"%s%d%s",a,&mt,b);
sscanf(cmf,"%s%d%s",a,&mf,b);
//printf("MEM: %lldB/%lldB\n",mf*1024,mt*1024);
}
char *cpustat(char *cpusage)
{
FILE *fp;
char ch[100],cpu[10];
fp=fopen("/proc/stat","r");
fgets(ch,sizeof(ch),fp);
fclose(fp);
long user,nice,sys,idle,iowait,irq,softirq,usage=0;
sscanf(ch,"%s%d%d%d%d%d%d%d",cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq);
tt=user+nice+sys+idle+iowait+irq+softirq;
if(i>0)usage=((tt-tt0)-(idle-idle0))*100/(tt-tt0);
//printf("%s,%d,%d,%d,%d,%d,%d,%d\n",cpu,user,nice,sys,idle,iowait,irq,softirq);
sprintf(cpusage,"%d%%",usage);
idle0=idle;
tt0=tt;
i++;
return cpusage;
}
netdev()
{
FILE *fp;
char ch[150],ch4[150],itf[10];
int r2,r3,r4,r5,r6,r7,r8,t2,t3,t4,t5,t6,t7,t8;
fp=fopen("/proc/net/dev","r");
fgets(ch,sizeof(ch),fp);
fgets(ch,sizeof(ch),fp);
fgets(ch,sizeof(ch),fp);
fgets(ch4,sizeof(ch4),fp);
fclose(fp);
//printf("%s\n",ch4);
sscanf(ch4,"%s%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",itf,&r1,&r2,&r3,&r4,&r5,&r6,&r7,&r8,&t1,&t2,&t3,&t4,&t5,&t6,&t7,&t8);
//printf("%d,%d\n",r1,t1);
}
char *B2G(long long b)
{
static char g[10];
if(b>999999999){
sprintf(g,"%.2fGB",(float)b/1073741824);
}else{
if(b>999999){
sprintf(g,"%.2fMB",(float)b/1048576);
}else{
if(b>999){
sprintf(g,"%.2fKB",(float)b/1024);
}else{
sprintf(g,"%dB",b);
}
}
}
return g;
}
gint settime(gpointer data)
{
char title[50],label1[1024],hms[10],mems[100],cpusage[20],cr[10],ct[10],crs[10],cts[10],cmu[10],cmt[10];
int rs,ts,memusage=0;
uptime(hms);
meminfo();
cpustat(cpusage);
netdev();
rs=r1-r0;
ts=t1-t0;
mu=mt-mf;
memusage=mu*100/mt;
strcpy(cmt,B2G(mt*1024));
strcpy(cmu,B2G(mu*1024));
strcpy(cr,B2G(r1));
strcpy(ct,B2G(t1));
strcpy(crs,B2G(rs));
strcpy(cts,B2G(ts));
sprintf(label1,"開機: %s\nCPU: %s\n記憶體: %s/%s=%d%%\n下載: %s , %s/s\n上傳: %s , %s/s",hms,cpusage,cmu,cmt,memusage,cr,crs,ct,cts);
sprintf(title,"C: %s M: %d%%\nD:%s/s U:%s/s",cpusage,memusage,crs,cts);
gtk_label_set_text(GTK_LABEL(label),label1);
gtk_window_set_title(GTK_WINDOW(window),title);
r0=r1;
t0=t1;
return TRUE;
}
int main(int argc,char* argv[])
{
gtk_init(&argc,&argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 100);
gtk_window_set_title(GTK_WINDOW(window),"CMDU");
label=gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(label),0,0);
gtk_misc_set_padding(GTK_MISC(label),5,10);
gtk_label_set_text(GTK_LABEL(label),"開機:\nCPU:\n記憶體:\n下載:\n上傳:");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_container_add(GTK_CONTAINER(window),label);
gint s=g_timeout_add(1000,settime,NULL);
g_signal_connect(GTK_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
return 0;
}