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

📄 son.c

📁 linux下的三进程三窗口程序
💻 C
字号:
#include <gtk/gtk.h>
#include <unistd.h>
#include <stdio.h>
typedef struct _ProgressData {
    GtkWidget *window;
    GtkWidget *pbar;
    int timer;
}   ProgressData;

int timeron=0; /*是否暂停的标志位*/
double new_val=0.0;

/* 时间回调,更新进度条*/
gint progress_timeout( gpointer data)
{   
    ProgressData *pdata = (ProgressData *)data;
    if(timeron)
        return  TRUE;		
    
   new_val += 0.01;
   if (new_val > 1.0)
    {	
        new_val = 1.0;
        gtk_main_quit ();
    }
   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
   return   TRUE;
} 

 /* 销毁窗口,移除定时器*/
void destroy_progress( GtkWidget *widget,ProgressData *pdata)
{
    gtk_timeout_remove (pdata->timer);
    pdata->timer = 0;
    pdata->window = NULL;
    g_free (pdata);
    gtk_main_quit ();
}

void callback1( GtkWidget *widget,gpointer   data )
{
    new_val=0.0;
}

void callback2( GtkWidget *widget,gpointer   data )
{
    if(timeron==1)  timeron=0;
    else    timeron=1;    	
}

void son_window(char *labeltext)
{
   ProgressData *pdata;
   GtkWidget *separator;
   GtkWidget *button;
    GtkWidget *button1;
    GtkWidget *button2;
   GtkWidget *vbox;
    GtkWidget *label;
    
   /* 为结构分配空间 */
   pdata = g_malloc (sizeof (ProgressData));
  
   pdata->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);

   g_signal_connect (G_OBJECT (pdata->window), "destroy",G_CALLBACK (destroy_progress),pdata);
   gtk_window_set_title (GTK_WINDOW (pdata->window), "儿子进程窗口");

   gtk_container_set_border_width (GTK_CONTAINER (pdata->window),0);
   vbox = gtk_vbox_new (FALSE, 5);
   gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
   gtk_container_add (GTK_CONTAINER (pdata->window), vbox);
    gtk_widget_set_usize(vbox,250,180);
   gtk_widget_show (vbox);
    
     /* 设置标签 */
    label = gtk_label_new (labeltext);
    gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
    gtk_widget_show (label);

    /* 设置进度条 */
   pdata->pbar = gtk_progress_bar_new ();
    gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar), GTK_PROGRESS_LEFT_TO_RIGHT);
    gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "son");
    gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), 0.0);
    gtk_box_pack_start (GTK_BOX (vbox), pdata->pbar, FALSE, FALSE, 0);
   gtk_widget_show (pdata->pbar);

    /* 设置定时器*/
    pdata->timer = gtk_timeout_add (200, progress_timeout, pdata);
    /* 设置分割线*/
    separator = gtk_hseparator_new ();
    gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);
    gtk_widget_show (separator);

    /* 设置reset按钮*/
   button1 = gtk_button_new_with_label ("reset");
   g_signal_connect_swapped (G_OBJECT (button1), "clicked",G_CALLBACK (callback1),pdata->window);
   gtk_box_pack_start (GTK_BOX (vbox), button1, FALSE, FALSE, 0);
    gtk_widget_show (button1);

    /* 设置start、pause按钮*/
   button2 = gtk_button_new_with_label ("start/pause");
   g_signal_connect_swapped (G_OBJECT (button2), "clicked",G_CALLBACK (callback2),pdata->window);
   gtk_box_pack_start (GTK_BOX (vbox), button2, FALSE, FALSE, 0);
    gtk_widget_show (button2);

    /*设置关闭按钮*/
   button = gtk_button_new_with_label ("close");
   g_signal_connect_swapped (G_OBJECT (button), "clicked",G_CALLBACK (gtk_widget_destroy),pdata->window);
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);

    /* 设置为缺省按钮 */
   GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);

   gtk_widget_grab_default (button);
   gtk_widget_show (button);

   gtk_widget_show (pdata->window);

   gtk_main (); 
}

int main( int argc,char *argv[])
{   
    int sid;
    char lbt[30];
    sid=getpid();
    sprintf(lbt,"儿子进程ID:%d",sid);
    gtk_init (&argc, &argv);
    if(fork()== 0)    /*子进程创建成功,调用子进程程序*/
    {    
        execv("./grandson",NULL);
     }
    else
    {
    son_window(lbt);
    }
   return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -