📄 son.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 + -