Hello all,

i am programming using MPICH + C++ and Gtk. I using Gtk to create the interactive interface (frontend), by which users can specify a
file to be processed by the parallelized program coded in MPICH and C++ (backend).

My problem arised with the combination of the three programming languages.
 
On the GUI, there is a button to bring up a File Open dialog for user selecting a file from the file system. The path of the selected file
will be displayed in a text box. Once users have selected a file Users can pass the file name to the parallelized program
by click another button (Execution Button).
In current design, the GUI is only used with one processor 'processor-0'. That is, 'processor-0' is responsible to accept users' input of the selected file
Then, it MPI_Bcast() the file path to other processors. As soon as ALL processors receive the file path, the parallelized process starts.

I can sucessfully bring up the GUI and select a file, showing the file path on the text box. However, when I press the Execution button, the parallelized
process cannot continue unless I close the GUI.
It seems that the execution control held by the Gtk program failed to be shifted to the parallelized program.

the code is as follows:
GtkWidget *QueryWord;
char Query_FileName[300] = "";
// ######  button2_click for assign the content of QueryWord to the global variable Query_FileName
gint button2_click(GtkWidget *widget,gpointer gdata)
{
 printf("I am here %d %s %s!\n", sizeof(gdata), gdata, (char *)gtk_entry_get_text(GTK_ENTRY(QueryWord)));
 
 strcpy(Query_FileName , (char *)gtk_entry_get_text(GTK_ENTRY(QueryWord)));
   
 return(FALSE);
}
// button_click for bring up the File Open dialog for selecting a file to be processed
gint button_click(GtkWidget *widget,gpointer gdata)
{
 GtkWidget *dialog;
 
 dialog = gtk_file_chooser_dialog_new ("Open File",
  GTK_WINDOW(gdata),
  GTK_FILE_CHOOSER_ACTION_OPEN,
  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
  GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
  NULL);
 
 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
 {
  char *filename;
  
  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
  
  gtk_entry_set_text(GTK_ENTRY(QueryWord), g_locale_to_utf8(filename,-1,NULL,NULL,NULL));
  printf("%s\n", filename);
  g_free (filename);
 }
 
 gtk_widget_destroy (dialog);
 return(FALSE);
}

int main(int argc, char *argv[])
{   
 
 
 int i;
    int    myid, numprocs;
    char Query_FileName[1000]="";
    double startwtime = 0.0, endwtime;
    int    namelen;
    char   processor_name[MPI_MAX_PROCESSOR_NAME];
 
    MPI_Init(&argc,&argv);    //MPI
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);  //MPI
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);  //MPI
    MPI_Get_processor_name(processor_name,&namelen); //MPI
 if (myid ==0) {
  
  GtkWidget *window;
  GtkWidget *table; /*Table*/
  GtkWidget *button, *button2; /*Button */
  GtkWidget *label;
  
  
  gtk_init(&argc, &argv);//<============================================================
  
  
  
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_widget_set_size_request(window,1000,800);
  g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
  
  
  
  table=gtk_table_new(8,8,TRUE); /*create a new table*/
  
  QueryWord=gtk_entry_new();/*create a text box*/
  gtk_table_attach(GTK_TABLE(table), QueryWord,1,7,1,2,GTK_FILL,GTK_FILL,0,0);/*add label*/
  gtk_widget_show(QueryWord);; /*show label*/
  
  
  button=gtk_button_new_with_label(g_locale_to_utf8("SEAsea",-1,NULL,NULL,NULL));
  gtk_table_attach(GTK_TABLE(table),button,2,4,2,3,GTK_FILL,GTK_FILL,0,0);
  gtk_widget_show(button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(button_click),window);
  
  button2=gtk_button_new_with_label(g_locale_to_utf8("Ocean",-1,NULL,NULL,NULL));
  gtk_table_attach(GTK_TABLE(table),button2,5,7,2,3,GTK_FILL,GTK_FILL,0,0);
  gtk_widget_show(button2);
  gtk_signal_connect(GTK_OBJECT(button2),"clicked",GTK_SIGNAL_FUNC(button2_click),(void*)gtk_entry_get_text(GTK_ENTRY(QueryWord)));
  
  gtk_container_add(GTK_CONTAINER(window),table); /*add table to window*/
  gtk_widget_show(table); /*show table*/
  
  
  
  
  gtk_widget_show(window);
  
  gtk_main();// it seems that the soluti on to this question is to find a way of how to shift  between gtk_main() and main(int argc, char *argv[])
 
  
 }
 if(myid == 0)
 {
  
  while(1)// wait Query_FileName is assigned by the user on GUI
  {
   if(strlen(Query_FileName) > 0)
   {
    MPI_Bcast( Query_FileName, strlen(Query_FileName), MPI_CHAR, 0, MPI_COMM_WORLD );/*processor-0 broadcast*/
    break;
   
   }
  }
 }
 else
 {
   
  while(1) //wait processor-0 broadcast Query_FileName
  {
   if(strlen(Query_FileName) == 0)
   {
    MPI_Bcast( Query_FileName, strlen(Query_FileName), MPI_CHAR, 0, MPI_COMM_WORLD );/*processor-xxx receive data*/
   }
   else
   {
    break;
   }
  }
 }



中国十大热门旅游景点 了解更多信息!