On Sat, Sep 22, 2007 at 10:49:56PM -0400, Andrew Smith wrote:
> I have the following setup:
> 
> gpointer thread1(gpointer data)
> {
>      run_long_function();
>      return NULL;
> }
> 
> gpointer thread2(gpointer data)
> {
>      GtkWidget* dialog;
> 
>      gdk_threads_enter();
>          dialog = gtk_message_dialog_new(GTK_WINDOW(win_main),
>                    GTK_DIALOG_DESTROY_WITH_PARENT,
>                    GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "asd");
>          gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
>          gtk_widget_show(dialog);
>      gdk_threads_leave();
> 
>      while (thread1 is running)
>      {
>          gdk_threads_enter();
>              //!! I want to make sure the dialog is shown
>              // the following does not help
>              while (gtk_events_pending())
>                  gtk_main_iteration();
>          gdk_threads_leave();
> 
>          usleep(500000);
>      }
> 
>      gdk_threads_enter();
>          gtk_widget_destroy(dialog);
>      gdk_threads_leave();
> 
>      return NULL;
> }

Scratch all this.

Access the GUI only from the thread running gtk_main() (AKA
main thread).

Never manually serialize Gtk+ main loop iterations with
gtk_main_iteration() (you are writing a *multithreaded*
program, remember).

NEVER do things like

    usleep(500000);

in the main thread.

Just construct and show the dialog and let the Gtk+ main
loop run normally (by quitting the function that constructs
it).

Add

    g_idle_add(long_function_finished, whatever);

to the end of the thread running long_function():
long_function_finished() will be executed in the main loop,
i.e. the main thread.

No locks, no obscure constructs, works on Win32 too.

Yeti

--
http://gwyddion.net/
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to