📄 cuozuoxitongkechengsheji275913647.c
字号:
gtk_widget_draw (drawing_area[1],NULL); /*曲线绘制完毕,通知绘图区将后端位图重新显示**/ }}/****从PROC文件中读出CPU利用信息,并计算得利用率,然后根据其更新进度条,以及建立CPU绘制曲线信息链表**//***然后创建线程在后台运行,以将曲线绘制到后端位图上显示*****/void refresh_cpupic(){ int i,j; mm_cpu_node *p1,*p2; pthread_t pthread1; float free; char pretotal[8],curtotal[8]; char buff[200]; char cpu_format[8]; cpu_total[0]=cpu_total[1]; /*保存前一时刻利用的CPU总量**/ cpu_used[0]=cpu_used[1]; /**保存前一时刻处于运行态的CPU利用总量**/ /**下面这一大段程序用以获取该时刻所用的CPU总量,以及处于运行态的CPU利用总量***/ read_file("/proc/stat",buff); for(i=5;i<strlen(buff)&&!isspace(buff[i]);i++) curtotal[i-5]=buff[i]; curtotal[i-5]='\0'; cpu_total[1]=atof(curtotal); for(i=i+1,j=0;i<strlen(buff)&&!isspace(buff[i]);i++,j++) curtotal[j]=buff[i]; curtotal[j]='\0'; cpu_total[1]+=atof(curtotal); cpu_used[1]=cpu_total[1]; for(i=i+1,j=0;i<strlen(buff)&&!isspace(buff[i]);i++,j++) curtotal[j]=buff[i]; curtotal[j]='\0'; cpu_total[1]+=atof(curtotal); for(i=i+1,j=0;i<strlen(buff)&&!isspace(buff[i]);i++,j++) curtotal[j]=buff[i]; curtotal[j]='\0'; cpu_total[1]+=atof(curtotal);/********************************************************************/ cpu_total[0]=cpu_total[1]-cpu_total[0]; /*该时刻获取的CPU总量减去前一时刻CPU的总量得这两个***/ /*时间点之间所用CPU的量*****/ cpu_used[0]=cpu_used[1]-cpu_used[0]; /**原理同上***/ free=cpu_used[0]/cpu_total[0]*100; /*这一很短时间段内CPU的使用率**/ sprintf(cpu_format,"%.2f%% ",free); /**显示在进度条上的信息***/ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(scl[0]),cpu_format); gtk_progress_bar_update(GTK_PROGRESS_BAR(scl[0]),free/100.0);/*更新进度条的状态**//*********下面程序段用以建立绘制CPU曲线时所用的链表******************/ if(cpu_node_count!=120) /*最多显示120个信息点***/ { for(p1=cpu_head,p2=cpu_head;p1;p2=p1,p1=p1->next); if(p1==cpu_head) { cpu_head=(mm_cpu_node *)malloc(sizeof(mm_cpu_node)); cpu_head->y=150.0*free/100.0; cpu_head->next=NULL; }else{ p1=(mm_cpu_node *)malloc(sizeof(mm_cpu_node)); p1->y=150.0*free/100.0; p1->next=NULL; p2->next=p1; } cpu_node_count+=1;/*还不到120个结点,每建一个结点,数目增加一*/ }else{ /*数目已经到了120*/ for(p1=cpu_head;p1;p2=p1,p1=p1->next);/*在链表末增添新的结点*/ p1=(mm_cpu_node *)malloc(sizeof(mm_cpu_node)); p1->y=150.0*free/100.0; p1->next=NULL; p2->next=p1; cpu_head=cpu_head->next;/*120个结点已经满,添加一个尾结点的同时应删除一个头结点*/ } pthread_create(&pthread1,NULL,draw_cpu_curve,NULL);
pthread_join(pthread1,NULL); /*创建一个后台线程,让其画好位图*/}/****从PROC文件中读出内存利用信息,并计算得利用率,然后根据其更新进度条,以及建立内存绘制曲线信息链表**//***然后创建线程在后台运行,以将曲线绘制到后端位图上显示*****/void refresh_mmpic(){ mm_cpu_node *p1,*p2; pthread_t pthread1; char total_mm[101]; char free_mm[101]; gchar mm_format[10]; int i; float total,free,beused;/**下面这一大段程序用以获取该时刻所用的CPU总量,以及处于运行态的内存利用总量***/ read_file("/proc/meminfo",total_mm); strcpy(free_mm,total_mm); select_string(total_mm,"MemTotal"); select_string(free_mm,"MemFree"); for(i=0;i<strlen(total_mm)&&!(isspace(total_mm[i]));i++); total_mm[i]='\0'; for(i=0;i<strlen(free_mm)&&!(isspace(free_mm[i]));i++); free_mm[i]='\0'; total=atof(total_mm); free=atof(free_mm); beused=total-free;/********************************************************************/ refresh_status_bar_mm(beused,free);/*刷新状态栏中显示的内存利用信息****/ free=beused*100/total; sprintf(mm_format,"%.2f%% ",free); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(scl[1]),mm_format); gtk_progress_bar_update(GTK_PROGRESS_BAR(scl[1]),free/100.0); if(mm_node_count!=120) { for(p1=mm_head,p2=mm_head;p1;p2=p1,p1=p1->next); if(p1==mm_head) { mm_head=(mm_cpu_node *)malloc(sizeof(mm_cpu_node)); mm_head->y=150.0*free/100.0; mm_head->next=NULL; }else{ p1=(mm_cpu_node *)malloc(sizeof(mm_cpu_node)); p1->y=150.0*free/100.0; p1->next=NULL; p2->next=p1; } mm_node_count+=1;/*还不到120个结点,每建一个结点,数目增加一*/ }else{ /*数目已经到了120*/ for(p1=mm_head;p1;p2=p1,p1=p1->next);//在链表末增添新的结点 p1=(mm_cpu_node *)malloc(sizeof(mm_cpu_node)); p1->y=150.0*free/100.0; p1->next=NULL; p2->next=p1; mm_head=mm_head->next;/*120个结点已经满,添加一个尾结点的同时应删除一个头结点*/ } pthread_create(&pthread1,NULL,draw_mm_curve,NULL);
pthread_join(pthread1,NULL); /*创建一个后台线程,让其画好位图*/ } /*绘图区一时间注册的函数,程序开始运行时,创建后端位图***/static gint configure_event(GtkWidget *widget, GdkEventConfigure *event,gpointer data){ int flag=(int)data; if (pixmap[flag]!=NULL)return 0; pixmap[flag] = gdk_pixmap_new(widget->window, /*新建位图*/ widget->allocation.width, widget->allocation.height,-1); gdk_draw_rectangle (pixmap[flag], widget->style->bg_gc[GTK_WIDGET_STATE(widget)],/*用背景色填充整个位图*/ TRUE, 0, 0, widget->allocation.width,widget->allocation.height); return TRUE;}/*下面这一函数每过一段时间就被调用一次,用以刷新一些信息(如CPU利用率)*/gboolean draw_cpu_mmpic(){ refresh_cpupic(); refresh_all_time(); refresh_mmpic(); refresh_status_bar_time(); count=(count+2)%21; return TRUE;}/***绘制第三个页面,性能页****/void draw_page2(GtkWidget *table){ gint i,*k; GtkWidget *frame; GdkColor bcolor,fcolor; char *s[]={"cpu","内存"}; char *s1[20]={"cpu利用率","内存利用率"}; for(i=0;i<2;i++) /*创建绘图区**/ { drawing_area[i]=gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area[i]),150,150); frame = gtk_frame_new (s[i]); gtk_widget_set_size_request(frame,180,180); gtk_widget_show (frame); gtk_table_attach_defaults(GTK_TABLE(table),frame,10,20,i*12,i*12+8); gtk_container_add(GTK_CONTAINER(frame),drawing_area[i]); gtk_widget_show(drawing_area[i]); bcolor.red = 0; bcolor.blue = 0; bcolor.green = 0; gtk_widget_modify_bg(drawing_area[i],GTK_STATE_NORMAL,&bcolor); fcolor.green=65535; fcolor.blue=25535; fcolor.red=35535; gtk_widget_modify_fg(drawing_area[i],GTK_STATE_NORMAL,&fcolor); }/*****************注册绘图区相关事件的函数****************************/ k=0; g_signal_connect(GTK_OBJECT(drawing_area[0]),"configure_event", G_CALLBACK(configure_event),k); g_signal_connect (G_OBJECT (drawing_area[0]), "expose_event", G_CALLBACK (expose_event_callback), k); k=1; g_signal_connect(GTK_OBJECT(drawing_area[1]),"configure_event", G_CALLBACK(configure_event),k); g_signal_connect(G_OBJECT (drawing_area[1]), "expose_event", G_CALLBACK (expose_event_callback), k);/**********************************************************************/ GtkWidget *label=gtk_label_new(""); gtk_widget_show(label); gtk_table_attach_defaults(GTK_TABLE(table),label,8,10,0,20); bcolor.red=15535; bcolor.green=15535; bcolor.blue=25535; for(i=0;i<2;i++) /*创建两个进度条,并设置其增长方向为由下向上*/ { scl[i]=gtk_progress_bar_new(); gtk_widget_show(scl[i]); gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(scl[i]), GTK_PROGRESS_BOTTOM_TO_TOP); frame=gtk_frame_new(s1[i]); gtk_widget_set_size_request(frame,150,100); gtk_widget_show(frame); gtk_container_add(GTK_CONTAINER(frame),scl[i]); if(i==0) gtk_table_attach_defaults(GTK_TABLE(table),frame,0,8,0,8); else gtk_table_attach_defaults(GTK_TABLE(table),frame,0,8,12,20); gtk_widget_modify_bg(scl[i],GTK_STATE_NORMAL,&bcolor); gtk_widget_modify_fg(scl[i],GTK_STATE_NORMAL,&fcolor); } draw_line(table,1,21,10,12);/***********创建时间控件,用以调用刷新信息的函数***************/ GtkWidget *timer=gtk_timeout_add(1200,(GtkFunction)draw_cpu_mmpic,NULL); return; }void draw_page3(GtkWidget *table){}/***绘制菜单***************/void draw_menu(GtkWidget *table){ GdkColor color; int i; char *s[]={"关机","重新启动","注销"};//第二个菜单项的子菜单 char *s1[]={"文件","关机","帮助"}; //三个主菜单项 GtkWidget *menu[3]; GtkWidget *menu_items; GtkWidget *root_menu; GtkWidget *menu_bar; gint (*operation[3])(GtkWidget *,GtkWidget *,gpointer)={ shutdown_computer, reboot_computer, logoff_computer}; color.red =45535; color.blue = 55535; color.green = 45535; for(i=0;i<3;i++) menu[i] = gtk_menu_new (); /**************第一个菜单项的菜单 *****************************/ menu_items = gtk_menu_item_new_with_label ("新任务"); gtk_menu_shell_append (GTK_MENU_SHELL (menu[0]), menu_items); g_signal_connect_swapped (G_OBJECT (menu_items), "activate", G_CALLBACK (new_thread),NULL); gtk_widget_show (menu_items); menu_items = gtk_menu_item_new_with_label ("退出"); gtk_menu_shell_append (GTK_MENU_SHELL (menu[0]), menu_items); g_signal_connect_swapped (G_OBJECT (menu_items), "activate", G_CALLBACK (delete),NULL); gtk_widget_show (menu_items); /************第二个菜单项******************/ for(i=0;i<3;i++) { menu_items = gtk_menu_item_new_with_label (s[i]); gtk_menu_shell_append (GTK_MENU_SHELL (menu[1]), menu_items); g_signal_connect_swapped (G_OBJECT (menu_items), "activate", G_CALLBACK (operation[i]),NULL); gtk_widget_show (menu_items); } /*************第三个菜单项*****************/ menu_items = gtk_menu_item_new_with_label ("关于"); gtk_menu_shell_append (GTK_MENU_SHELL (menu[2]), menu_items); g_signal_connect_swapped (G_OBJECT (menu_items), "activate", G_CALLBACK (help_about),NULL); gtk_widget_show (menu_items); /****************创建菜单条***********/ menu_bar = gtk_menu_bar_new (); gtk_widget_show (menu_bar); for(i=0;i<3;i++) { root_menu = gtk_menu_item_new_with_label (s1[i]); gtk_widget_show (root_menu); gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu[i]); gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu); } gtk_table_attach_defaults (GTK_TABLE (table), menu_bar, 0,6,0,1); gtk_widget_modify_bg(menu_bar, GTK_STATE_NORMAL, &color); }/***绘制笔记本***********/GtkWidget *draw_notebook(GtkWidget *table,int left,int right,int top,int bottom){ int i=0; GtkWidget *tbl[4],*btn; char buff[4][20]={" 进程 "," 系统 "," 性能 ", " 用户 "}; GtkWidget *notebook; GtkWidget *frame; GtkWidget *label; GtkWidget *event_box; void (*operations[4])(GtkWidget *)={draw_page0,draw_page1,draw_page2,draw_page3}; while(i++<4) { tbl[i-1] = gtk_table_new (20,21, FALSE); gtk_widget_show(tbl[i-1]); } event_box = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (event_box), tbl[0]); gtk_widget_show (event_box); gtk_widget_set_events (event_box, GDK_BUTTON_PRESS_MASK); g_signal_connect (G_OBJECT (event_box), "button_press_event",G_CALLBACK (popup_menu), NULL); notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); gtk_table_attach_defaults (GTK_TABLE (table), notebook, left,right,top,bottom); gtk_widget_show (notebook); for (i = 0; i < 4; i++) { frame = gtk_frame_new (""); gtk_container_set_border_width (GTK_CONTAINER (frame), 10); gtk_widget_set_size_request (frame, 1, 380); gtk_widget_show (frame); label = gtk_label_new (buff[i]); if(i==0) gtk_notebook_append_page (GTK_NOTEBOOK (notebook),event_box, label);/*将事件所盒加进去*/ /*用来捕获鼠标右键的相关信息*/ else gtk_notebook_append_page (GTK_NOTEBOOK (notebook),tbl[i], label); if(i!=2)gtk_table_attach_defaults (GTK_TABLE (tbl[i]), frame,0,1,0,20); operations[i](tbl[i]); } gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook),0); return notebook; } /*************绘制状态栏*****/void draw_statusbar(GtkWidget *table,GtkWidget *status_bar[],int count){ while(--count>=0) { status_bar[count] = gtk_statusbar_new (); gtk_table_attach_defaults(GTK_TABLE(table),status_bar[count],2*count,2*count+2,3,4); gtk_widget_show (status_bar[count]); gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(status_bar[count]),FALSE); } return;}int main(int argc,char **argv){ GtkWidget *window; GtkWidget *button; GtkWidget *table; GtkWidget *lable; GtkWidget *checkbutton,*file_item; int i; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title(window,"系统监视器"); gtk_window_move(GTK_WINDOW(window),140,100); g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (delete), NULL); gtk_window_resize(GTK_WINDOW(window),400,400); gtk_container_set_border_width (GTK_CONTAINER (window), 10); table = gtk_table_new (4, 6, FALSE); lable=gtk_label_new(""); gtk_widget_show(lable); gtk_container_add (GTK_CONTAINER (window), table); gtk_table_attach_defaults(GTK_TABLE(table),lable,0,6,1,2); draw_menu(table); draw_notebook(table,0,6,2,3); draw_statusbar(table,status,3); gtk_widget_show (table); gtk_widget_show(window); gtk_main(); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -