📄 cuozuoxitongkechengsheji275913647.c
字号:
closedir(dirp); //在这写取进程信息的程序段 char pidbuff[60]; sprintf(pidbuff,"当前进程数:%d(点击立即刷新)",COUNT_PID); if(pidcountlab)gtk_button_set_label(GTK_BUTTON(pidcountlab),pidbuff); return TRUE; }/***该函数用于结束所选择的进程*****/gint exit_selectpid(GtkWidget *widget, GtkWidget *event, gpointer data )//结束选中的进程 gpointer data 参数传进来进程号{ int i; int j; if(gtk_clist_get_selectable(GTK_CLIST(clist),S_ROW)==TRUE) { char *text; char killpid[20]="kill "; GtkWidget *d; /***先弹出一对话框用以警示**********************************/ d = gtk_dialog_new_with_buttons ("结束进程", NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); GtkWidget *label = gtk_label_new ("结束进程?"); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(d)->vbox),label); gtk_widget_show(label); gint result = gtk_dialog_run (GTK_DIALOG (d)); switch (result) { case GTK_RESPONSE_ACCEPT:/***如果点击确定**********/ gtk_clist_get_text(GTK_CLIST(clist),S_ROW,1,&text);/*通过行号获取改行第一列的字符串*/ /*即PID号*/ for(i=0;isspace(text[i]);i++); for(j=i,i=0;j<strlen(text);j++,i++) killpid[i+5]=text[j]; killpid[i+5]='\0'; system(killpid); gtk_clist_remove(GTK_CLIST(clist),S_ROW);/*删除该行*/ COUNT_PID--; /*进程数减一*/ S_ROW=10000; /*使该行不呈现选择状态*/ char pidbuff[60]; sprintf(pidbuff,"当前进程数:%d(点击立即刷新)",COUNT_PID); if(pidcountlab)gtk_button_set_label(GTK_BUTTON(pidcountlab),pidbuff); break; default: break; } gtk_widget_destroy (d); } return FALSE; }/*在列表框中选中一行时调用该函数****/gboolean select_op(GtkWidget *widget,gint row,gint column, GtkWidget *event, gpointer data ){ S_ROW=row; /**用一外部变量保存所选择的行号***/ return TRUE;}/***查找一进程,可通过PID或进程名,查找成功,使该行处于选择状态****/void find_pid(GtkWidget *widget,gint row,gint column, GtkWidget *event, gpointer data ){ int i; char new_pidname[256]; GtkWidget *d = gtk_dialog_new_with_buttons ("My dialog", NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); GtkWidget *entry_pid=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY (entry_pid), "输入要待查进程的进程号(名)"); gtk_widget_show(entry_pid); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(d)->vbox), entry_pid); gint result = gtk_dialog_run (GTK_DIALOG (d)); switch (result) { case GTK_RESPONSE_ACCEPT: strcpy(new_pidname,gtk_entry_get_text(GTK_ENTRY (entry_pid))); for(i=0;i<strlen(new_pidname)&&isdigit(new_pidname[i]);i++); if(i==strlen(new_pidname)) //输入的是进程号 { char *pid[20]; int j; for(i=0;i<COUNT_PID;i++) { gtk_clist_get_text(clist,i,1,pid); for(j=0;j<strlen(pid[0])&&isspace(pid[0][j]);j++); if(strcmp(new_pidname,pid[0]+j)==0)break; } if(i<COUNT_PID) { gtk_clist_moveto(clist,i,0,0.5,0.2); gtk_clist_select_row(clist,i,0); } }else{ /*如果输入的是进程名*/ char *pid[20]; int j,k; for(i=0;i<COUNT_PID;i++) { gtk_clist_get_text(clist,i,0,pid); for(j=0;j<strlen(pid[0])&&isspace(pid[0][j]);j++); if(strcmp(pid[0],new_pidname)==0)break; } if(i<COUNT_PID) { gtk_clist_moveto(clist,i,2,0.5,0.2); gtk_clist_select_row(clist,i,2); } } if(i==COUNT_PID) { gtk_widget_destroy (d); GtkWidget *dialog, *label; dialog = gtk_dialog_new_with_buttons ("查找进程", NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_NONE, NULL); label = gtk_label_new ("没有找到该进程"); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label); gtk_widget_show(label); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return; } break; default: break; } gtk_widget_destroy (d); return; } /**绘制右键弹出菜单**********/gint popup_menu(GtkWidget *widget,GdkEvent *event){ if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *bevent = (GdkEventButton *) event; GtkWidget *menu=gtk_menu_new(); gtk_container_set_border_width (GTK_CONTAINER (menu), 5); GtkWidget *menu_item; if(S_ROW!=10000) { menu_item=gtk_menu_item_new_with_label("详细信息"); gtk_menu_append(menu,menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(more_info),NULL); menu_item=gtk_menu_item_new_with_label("结束任务"); gtk_menu_append(menu,menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(exit_selectpid),NULL); } menu_item=gtk_menu_item_new_with_label("新建任务"); gtk_menu_append(menu,menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(new_thread),NULL); menu_item=gtk_menu_item_new_with_label("查找进程"); gtk_menu_append(menu,menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(find_pid),NULL); menu_item=gtk_menu_item_new_with_label("关于"); gtk_menu_append(menu,menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(help_about),NULL); menu_item=gtk_menu_item_new_with_label("退出"); gtk_menu_append(menu,menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(delete),NULL); gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL,bevent->button, bevent->time); return TRUE; } return FALSE;} /***绘制第一个页面****/void draw_page0(GtkWidget *table){ char *s[]={" 进程 "," pid "," ppid "," 进程状态 "};//列表中的项 GtkWidget *scrolled_window; scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_widget_show (scrolled_window); clist=gtk_clist_new_with_titles(4,s); gtk_table_attach_defaults(GTK_TABLE(table),scrolled_window,1,20,0,20); gtk_container_add(GTK_SCROLLED_WINDOW(scrolled_window),clist); gtk_widget_show(clist); GtkWidget *btn=gtk_button_new_with_label("结束进程"); g_signal_connect(G_OBJECT(clist),"select-row",G_CALLBACK(select_op),NULL); g_signal_connect(GTK_BUTTON(btn),"clicked",G_CALLBACK(exit_selectpid),NULL); gtk_widget_show(btn); gtk_table_attach_defaults(GTK_TABLE(table),btn,18,20,20,21); btn=gtk_button_new_with_label("进程查找"); gtk_widget_show(btn); g_signal_connect(GTK_BUTTON(btn),"clicked",G_CALLBACK(find_pid),NULL); gtk_table_attach_defaults(GTK_TABLE(table),btn,16,18,20,21); btn=gtk_button_new_with_label("切换任务"); gtk_widget_show(btn); g_signal_connect(GTK_BUTTON(btn),"clicked",G_CALLBACK(new_thread),NULL); gtk_table_attach_defaults(GTK_TABLE(table),btn,14,16,20,21); pidcountlab=gtk_button_new_with_label(""); gtk_widget_show(pidcountlab); gtk_table_attach_defaults(GTK_TABLE(table),pidcountlab,1,14,20,21); g_signal_connect(GTK_BUTTON(pidcountlab),"clicked",G_CALLBACK(refresh_pidlist),NULL); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); refresh_pidlist(); GtkWidget *timer=gtk_timeout_add(5000,(GtkFunction)refresh_pidlist,NULL); }/***刷新系统运行总时间**********/void refresh_all_time(){ char buf[30]; get_string(0,buf); gtk_label_set_text(GTK_LABEL(all_time_label),buf); return;} /*获取字符串,如可以调用该函数得到该所使用操作系统的版本*/void get_string(int flag,char *buf){ switch(flag) { case 0:read_file("/proc/uptime",buf);buf[strlen(buf)/2]='\0';break; case 1:read_file("/proc/version",buf);buf[23]='\0';break; case 2:read_file("/proc/cpuinfo",buf);select_string(buf,"vendor_id");break; case 3:read_file("/proc/cpuinfo",buf);select_string(buf,"model name");break; case 4:read_file("/proc/sys/kernel/hostname",buf);break; default:break; } return; }/*********绘制第二个页面,就是显示系统相关信息的页面***********/void draw_page1(GtkWidget *table){ char buf[1024]; char *s[]={"系统启动的时间","系统到目前为止运行的时间","系统的版本号","cpu的型号","cpu的主频","主机名"}; int i=0; GtkWidget *label; label=gtk_label_new("系统信息"); gtk_widget_show(label); gtk_table_attach_defaults(GTK_TABLE(table),label,1,20,0,1); draw_line(table,1,20,1,2); while(i++<5) {label=gtk_label_new(s[i]); gtk_widget_show(label); gtk_table_attach_defaults(GTK_TABLE(table),label,1,20,i*3+2,i*3+3); get_string(i-1,buf); label=gtk_label_new(buf); if(i==1)all_time_label=label; gtk_widget_show(label); gtk_table_attach_defaults(GTK_TABLE(table),label,1,20,i*3+3,3*i+4); draw_line(table,1,20,i*3+4,3*i+5); } for(i=17;i<20;i++) { label=gtk_label_new(""); gtk_widget_show(label); gtk_table_attach_defaults(GTK_TABLE(table),label,1,20,i,i+1); } return; }/*绘制绿色的格子**/gboolean draw_pic(int flag){ int i; if(drawing_area[flag]!=NULL&&pixmap[flag]!=NULL) { gdk_draw_rectangle (pixmap[flag], drawing_area[flag]->style->bg_gc[GTK_WIDGET_STATE(drawing_area[flag])], TRUE, 0, 0, drawing_area[flag]->allocation.width, drawing_area[flag]->allocation.height); for(i=0;i<=drawing_area[flag]->allocation.width/21+1;i++) { /*绘制竖线,加上count是为了产生移动的效果,因为count在定时刷新函数里每*/ /*过一段时间就被改变(相关语句:count=(count+2)%21)*/ gdk_draw_line(pixmap[flag], drawing_area[flag]->style->fg_gc[GTK_WIDGET_STATE (drawing_area[flag])], (i*21-count)<0?0:(i*21-count),0,(i*21-count)<0?0:(i*21-count), /*绘制横线,不用移动*/ drawing_area[flag]->allocation.height); gdk_draw_line(pixmap[flag], drawing_area[flag]->style->fg_gc[GTK_WIDGET_STATE (drawing_area[flag])],0,i*21, drawing_area[flag]->allocation.width,i*21); } } return TRUE; }/* 从后端位图重新绘制屏幕 */static gintexpose_event_callback (GtkWidget *widget, GdkEventExpose *event,gpointer data){ int flag=data; if(pixmap[flag]!=NULL&&drawing_area[flag]!=NULL) { gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap[flag], event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); } return FALSE;}/*********绘制CPU利用率的曲线***************/void *draw_cpu_curve(){ draw_pic(0); mm_cpu_node *p1,*p2; int i=cpu_node_count; if(drawing_area[0]!=NULL&&pixmap[0]!=NULL) { GdkColor color; color.red=65535; /*更改画曲线的颜色***/ color.green=0; color.blue=0; gtk_widget_modify_fg(drawing_area[0],GTK_STATE_NORMAL,&color); if(i>=2) /***如果链表中的节点个数小于2,则不绘制******/ { for(p1=cpu_head,p2=cpu_head->next;p2;p1=p1->next,p2=p2->next,i--) gdk_draw_line(pixmap[0], /**在两个节点间画线***/ drawing_area[0]->style->fg_gc[GTK_WIDGET_STATE (drawing_area[0])], drawing_area[0]->allocation.width-2*i,drawing_area[0]->allocation.height-p1->y-4, drawing_area[0]->allocation.width-2*(i-1), drawing_area[0]->allocation.height-p2->y-4); } color.green=65535; /*将颜色复原*/ color.blue=25535; color.red=35535; gtk_widget_modify_fg(drawing_area[0],GTK_STATE_NORMAL,&color); gtk_widget_draw (drawing_area[0],NULL); /*曲线绘制完毕,通知绘图区将后端位图重新显示**/ }}/*绘制内存利用率曲线****/void *draw_mm_curve(){ draw_pic(1); mm_cpu_node *p1,*p2; int i=mm_node_count; if(drawing_area[1]!=NULL&&pixmap[1]!=NULL) { GdkColor color; color.red=65535; /*更改画曲线的颜色***/ color.green=0; color.blue=0; gtk_widget_modify_fg(drawing_area[1],GTK_STATE_NORMAL,&color); if(i>=2) /***如果链表中的节点个数小于2,则不绘制******/ { for(p1=mm_head,p2=mm_head->next;p2;p1=p1->next,p2=p2->next,i--) gdk_draw_line(pixmap[1], /**在两个节点间画线***/ drawing_area[1]->style->fg_gc[GTK_WIDGET_STATE (drawing_area[1])], drawing_area[1]->allocation.width-2*i,drawing_area[1]->allocation.height-p1->y-15, drawing_area[1]->allocation.width-2*(i-1), drawing_area[1]->allocation.height-p2->y-15); } color.green=65535; color.blue=25535; color.red=35535; gtk_widget_modify_fg(drawing_area[1],GTK_STATE_NORMAL,&color);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -