>From the man page for sleep(3):
----
BUGS
       sleep()  may be implemented using SIGALRM; mixing calls to alarm() and
       sleep() is a bad idea.
----

My guess is that the file dialog has set up something to let it know if
some part of it is taking too long, and is using alarm() for that.

I suggest you use select() instead of sleep() and check to see if it
returns -1 and, if it does, check errno for a value of EINTR, and if it
is EINTR, call your sleep function with the reamining time to delay
(which is found in the timeval var passed by address).


  // Wally

On Mon, 2007-11-26 at 14:47 -0800, Gnaural wrote:
> Maybe I'm just doing something stupid here. But I'd
> like to know what, at least!
> 
> Below is an example of a mysterious (well, mysterious
> to me) problem I've encountered, involving some sort
> of interaction between a gtk_file_chooser_dialog_new
> and I thought was a completely separate thread.
> 
> I'm hoping someone here can tell me what's behind
> this, and how I can avoid it.
> 
> This test example creates a thread which:
> 
> 1) announces it is going to sleep for 30 seconds
> 2) attempts to sleep for 30 seconds
> 3) reports how long it actually slept
> 
> Once that sleeper thread is created, the main thread
> creates a gtk_file_chooser_dialog_new. At which point
> the sleeper thread instantly stops sleeping and
> reports that it slept 0 seconds.
> 
> But if I call, say, gtk_message_dialog_new instead,
> the sleeper thread sleeps the normal amount of time
> (and reports such).
> 
> Incidentally, I realize that gtk_main is doing nothing
> here; I've also tried launching the dialogs from a
> timeout (with appropriate
> gdk_threads_enter/gdk_threads_leave as stated in the
> FAQ), and I see the same thing; I left that out here
> just to make this as simple as possible.
> 
> Thanks for any info!
> //////////////////////////////////////
> /*
> Demonstration of strange
> gtk_file_chooser_dialog_new/thread interaction.
> Compile with:
> gcc main.c -o HelloThreadBreaker \
> `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
> */
> #include <unistd.h>
> #include <gtk/gtk.h>
> 
> void *sleep_for_awhile (void *args)
> {
> time_t t1;
> time_t t2;
> 
> g_print ("Going to sleep for 30 seconds\n");
> time (&t1);
> sleep (30);
> time (&t2);
> g_print ("I slept for %d seconds\n", (int) (t2 - t1));
> return NULL;
> }
> 
> int main (int argc, char *argv[])
> {
> char *filename;
> GError *error = NULL;
> GtkWidget *dialog = NULL;
> 
> g_thread_init (NULL);
> gdk_threads_init ();
> gdk_threads_enter ();
> 
> gtk_init (&argc, &argv);
> 
> if (!g_thread_create (sleep_for_awhile, NULL, FALSE,
> &error))
> {
> g_printerr ("Failed to create sleep_for_awhile
> thread:%s\n",
> error->message);
> return 1;
> }
> 
> dialog = gtk_file_chooser_dialog_new ("Open File",
> NULL,
> 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)
> {
> filename = gtk_file_chooser_get_filename
> (GTK_FILE_CHOOSER (dialog));
> g_free (filename);
> }
> 
> /*
> //this variety doesn't affect thread:
> dialog = gtk_message_dialog_new (NULL,
> GTK_DIALOG_MODAL,
> GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
> "Message Box");
> gtk_dialog_run (GTK_DIALOG (dialog));
> */
>  
> gtk_widget_destroy (dialog);
> 
> gtk_main ();
> gdk_threads_leave ();
> 
> return 0;
> }
> 
> 
> 
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
-- 
[EMAIL PROTECTED]
Office: 619.278.2084
Cell:   619.990.2286

_______________________________________________
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