[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: Updating (showing) the widgets of a dialog in a g_thread
- From: David Nečas (Yeti) <yeti physics muni cz>
- To: gtk-app-devel-list gnome org
- Subject: Re: Updating (showing) the widgets of a dialog in a g_thread
- Date: Sun, 23 Sep 2007 09:24:18 +0200
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/
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]