[問題] 請教在gtk程式下的fork如何update UI?
我的目的是要在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
討論串 (同標題文章)
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章