Re: Warnings/Errors during Threaded Execution
- From: "Brian J. Tarricone" <bjt23 cornell edu>
- To: gtk-devel-list gnome org
- Cc: gtk-app-devel-list gnome org
- Subject: Re: Warnings/Errors during Threaded Execution
- Date: Thu, 30 Nov 2006 13:49:29 -0800
(Please move this discussion over to gtk-app-devel-list. gtk-devel-list
is for the development of gtk itself.)
Christopher Bland wrote:
> Brian J. Tarricone wrote:
>
>>> Clicking the first button fires the 'clicked' event where I make the
>>> following calls:
>>>
>>> g_thread_init(NULL);
>>> gdk_threads_init();
>
>> Looks like you didn't read the docs well enough then. Those two calls
>> *must* come *before* your gtk_init() call. Then, as another poster
>> suggested, you need to surround the call to gtk_main() like so:
>
> Right on... I did miss that part. I'm obviously new to GTK but not to
> threading and I'm having a hard time wrapping my brain around this for
> some reason.
>
> I cleared up the warning messages, however I am still hung up; I've
> pasted a sample below. When I click the 'Start' button it freezes and
> I'm not using threads, although I think it should be set up to run
> them. I'm unfortunately the only developer in my shop so I can't get
> another pair of eyes to look at this and I've been driving myself crazy
> all day. Any suggestions would be appreciated.
That's cuz you missed one of the other things I said above: gtk signal
callbacks are run with the gdk lock held, so you must not call
gdk_threads_enter() in a signal callback. Your beginScan() callback
calls setStatus(), which does just that.
(On a side note, I'd suggest you replace:
> while (g_main_context_iteration(NULL, FALSE));
with:
while(gtk_events_pending())
gtk_main_iteration();
-brian
>
>
> [code]
> #include <stdio.h>
> #include <gtk/gtk.h>
>
>
> GtkWidget *statusbar;
> static guint context_id;
>
> int setStatus (char*, char*);
>
>
> static void beginScan (GtkWidget *widget, gpointer data)
> {
> printf("Hello World!\n");
> setStatus("0.0", "Working...");
> }
>
>
> /* Callback function to set the progress bar from other functions */
> int setStatus (char *fraction, char *text)
> {
>
> gdk_threads_enter();
> gtk_statusbar_push(GTK_STATUSBAR(statusbar), context_id, text);
> while (g_main_context_iteration(NULL, FALSE));
> gdk_threads_leave();
>
> return 0;
> }
>
>
> /* Callback to do some cleanup if a delete_event is called */
> static gboolean delete_event (GtkWidget *widget, GdkEvent *event,
> gpointer data )
> {
> /* TODO: Need to put some cleanup stuff here... */
> return FALSE;
> }
>
>
> /* Callback to destroy the window and all of its widgets */
> static void destroy (GtkWidget *widget, gpointer data)
> {
> gtk_main_quit ();
> }
>
>
> int main(int argc, char *argv[])
> {
> GtkWidget *window, *button1;
> GtkWidget *vbox1, *info_frame;
>
> g_thread_init(NULL);
> gdk_threads_init();
>
> gtk_init (&argc, &argv);
>
> /* create a new window */
> window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
> gtk_window_set_title(GTK_WINDOW(window), "Aurora Hard Drive
> Forensics");
> gtk_window_set_default_size(GTK_WINDOW(window), 200, 125);
> gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
> gtk_container_set_border_width (GTK_CONTAINER(window), 3);
>
> g_signal_connect (G_OBJECT(window), "delete_event",
> G_CALLBACK(delete_event), NULL);
> g_signal_connect (G_OBJECT(window), "destroy", G_CALLBACK(destroy),
> NULL);
>
> /* Create the vertical packing box and the two frames */
> vbox1 = gtk_vbox_new(FALSE, 0);
> info_frame = gtk_frame_new("Information");
>
> button1 = gtk_button_new_with_label("Start Scan");
> g_signal_connect(G_OBJECT(button1), "clicked",
> G_CALLBACK(beginScan), NULL);
> gtk_container_add(GTK_CONTAINER(info_frame), button1);
>
> /* Create the status bar */
> statusbar = gtk_statusbar_new();
> gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(statusbar), FALSE);
> context_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar),
> "Statusbar");
> gtk_statusbar_push(GTK_STATUSBAR(statusbar), context_id, "Idle");
>
>
> /*************************************************************************/
> /* Start packing the boxes and frames into the window */
> gtk_box_pack_start(GTK_BOX(vbox1), info_frame, TRUE, TRUE, 0);
> gtk_box_pack_start(GTK_BOX(vbox1), statusbar, FALSE, TRUE, 0);
> gtk_container_add(GTK_CONTAINER(window), vbox1);
>
>
> /*************************************************************************/
> /* The final step is to display this newly created widget. */
> gtk_widget_show_all(window);
> gtk_widget_show(window);
>
> gdk_threads_enter();
> gtk_main();
> gdk_threads_leave();
>
> return 0;
> }
> [/code]
>
> c++ `pkg-config --cflags --libs gtk+-2.0 gthread-2.0` gtk_thread_test.c
>
>
> ________________________________________________________________________
> Try Juno Platinum for Free! Then, only $9.95/month!
> Unlimited Internet Access with 1GB of Email Storage.
> Visit http://www.juno.com/value to sign up today!
>
>
[
Date Prev][Date Next] [
Thread Prev][Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]