A problem about programming with gtk+ in multiprocess.
- From: ÀîÓê <raise_sail sina com>
- To: gtk-list gnome org <gtk-list gnome org>
- Subject: A problem about programming with gtk+ in multiprocess.
- Date: Sun, 16 Dec 2001 18:8:13 +0800
hello all,
I have a problem when programming with gtk+ in multiprocess.
please look follow codes :
/* runcmd.c */
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <dirent.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <time.h>
/* for callback func's argument */
typedef struct cb_data_t_ {
GtkWidget* label;
} cb_data_t;
/* update GtkWidget , display its change */
gint
updatewid(GtkWidget* wid)
{
if ( GTK_IS_WIDGET(wid) )
{
gtk_widget_show_all(wid);
while (gtk_events_pending())
gtk_main_iteration();
return 0;
}
return 1;
}
/* core codes, but it have some problems */
gint
display_runcmd(cb_data_t* cb_data)
{
pid_t pidno;
pidno = fork();
switch (pidno)
{
case 0:
{
/* in child process , i change text of GtkLabel, and update it */
time_t t;
char* chartime;
gchar* text, *newtext;
time(&t);
chartime = g_strdup(ctime(&t)) ;
gtk_label_get(GTK_LABEL(cb_data->label), &text);
newtext = g_strdup_printf("%s%s",text, chartime);
gtk_label_set_text(GTK_LABEL(cb_data->label), chartime);
updatewid(cb_data->label);
g_free(text);
g_free(newtext);
_exit(0);
}
case -1:
g_error("fork child 2 process error !");
default:
return 0;
};
return 0;
}
/* exit this program */
static gint
destroy(GtkWidget* wid, cb_data_t* cb_data)
{
gtk_main_quit();
return 0;
}
static gint
start_cb(GtkWidget* start, cb_data_t* cb_data)
{
return display_runcmd(cb_data);
}
static gint
stop_cb(GtkWidget* stop, cb_data_t* cb_data)
{
gtk_label_set_text(GTK_LABEL(cb_data->label), "**** Ready for display ... ****\n");
updatewid(cb_data->label);
return 0;
}
/* follow code create GUI */
int
main(int argc, char** argv)
{
GtkWidget *win ,*scrwin, *label, *hbox, *vbox;
GtkWidget* start ,*stop;
cb_data_t cb_data;
gtk_init(NULL, NULL);
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
scrwin = gtk_scrolled_window_new (NULL, NULL);
label = gtk_label_new("**** Ready for display ... ****\n");
hbox = gtk_hbox_new(FALSE, 0);
vbox = gtk_vbox_new(FALSE, 0);
start = gtk_button_new_with_label(" Display ... ");
stop = gtk_button_new_with_label(" Clear ! ");
cb_data.label = label;
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (scrwin), label);
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrwin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
gtk_widget_set_usize(scrwin, 400, 400);
gtk_widget_set_usize(hbox, 400, 20);
gtk_widget_set_usize(win, 400, 420);
gtk_box_pack_start(GTK_BOX(hbox), start, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(hbox), stop, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), scrwin, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(win), vbox);
gtk_signal_connect(GTK_OBJECT(start), "clicked",
GTK_SIGNAL_FUNC(start_cb),
&cb_data );
gtk_signal_connect(GTK_OBJECT(stop), "clicked",
GTK_SIGNAL_FUNC(stop_cb),
&cb_data );
gtk_signal_connect(GTK_OBJECT(win), "delete_event",
GTK_SIGNAL_FUNC(gtk_false),
NULL );
gtk_signal_connect(GTK_OBJECT(win), "destroy",
GTK_SIGNAL_FUNC(destroy),
&cb_data );
gtk_widget_show_all(win);
gtk_main();
return 0;
}
when I run this program, it sometime display normaly,
but more time it failed ,and sometime print like
"Xlib: unexpected async reply (sequence 0x230)!"
I found if I change text of GtkLabel in parent process, it will be OK!
Woule you help me ? thank you in advance.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]