[問題] 請教在gtk程式下的fork如何update UI?

看板LinuxDev作者 (Kelvin)時間18年前 (2006/12/27 01:07), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/3 (看更多)
我的目的是要在fork的child裏面去update 一個gtk progress bar 但是不成功 無法把progress bar由1 數到 100 還請各位先進指教 ps: 其實這個問題已經在ubuntu forums的programming版發問 程式碼也有post上去 http://ubuntuforums.org/showthread.php?t=323435 程式碼如下 #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <gtk/gtk.h> GtkWidget *button; GtkWidget *progressbar; double fraction=0.0; void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } void fork_me(GtkWidget *widget, gpointer data) { /*Pipe Section */ int pipe1[2]; //pointer to filedescriptor for pipe int pipe_stat; pipe_stat = pipe(pipe1); //creation of pipe /* The pipe1[0] is used for reading - parent from child AND child from parent pipe1[1] is used for writing */ pid_t pid; pid = fork(); if(pid == -1) { /* ouch, fork() failed */ perror("fork"); exit(-1); } else if(pid == 0) { /* child */ double fr=0.0; int i=0; fprintf(stderr, "Child: pid = %d\n", (int)getpid()); fr = gtk_progress_bar_get_fraction(progressbar); printf("%.02f\n",fr); for(i=0;i<5;i++) //use for loop try to update UI for several times { sleep(0.5); fr +=0.01; printf("%.02f\n",fr); write(pipe1[1], &fr, sizeof(fr)); //child sends data to parent } close(pipe1[0]); //child does not read //gtk_button_set_label(button, str); //does not work!!! printf("Exiting child ...\n"); _exit(-1); } else { /* parent */ double fr = 0.0; char str[10]; close(pipe1[1]); //parent does not write; read(pipe1[0], &fr, sizeof(fr)); //parent reads data from child (str) sprintf(str,"%.0f%%", fr*100.0); printf("percent= %s\n", str); gtk_progress_bar_set_fraction(progressbar, fr); gtk_progress_bar_set_text(progressbar, str); fprintf(stderr, "Parent: forked a child with pid = %d\n", (int)pid); } } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox1; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(destroy), NULL); gtk_container_set_border_width(GTK_CONTAINER (window), 10); /* add a button to do something usefull */ vbox1 = gtk_vbox_new( 0, 2); button = gtk_button_new_with_label("0"); progressbar = gtk_progress_bar_new(); gtk_signal_connect(GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC(fork_me), NULL); gtk_container_add(GTK_CONTAINER(window), vbox1); gtk_container_add(GTK_CONTAINER(vbox1), progressbar); gtk_container_add(GTK_CONTAINER(vbox1), button); /* show everything */ gtk_widget_show_all(window); /* main loop */ gtk_main (); exit(0); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.64.139.14
文章代碼(AID): #15aLRfDk (LinuxDev)
文章代碼(AID): #15aLRfDk (LinuxDev)