⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cuozuoxitongkechengsheji275913647.c

📁 GTK2.0编程 操作系统课程设计的一个小题目
💻 C
📖 第 1 页 / 共 3 页
字号:
       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 + -