A problem about programming with gtk+ in multiprocess.



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]