As nobody else seems to want to follow up on this, I'll try to...
(Please, no *personal* replies to me. Follow up to the list.)


> > Maybe there is a reason that can explain this phenomenon. You can launch a
> > thread with g_idle_add or g_time_out_add,
>   

Sorry, either you are misunderstanding seriously, or just using the
term "thread" in a way that nobody else does. g_idle_add() and
g_timeout_add() do *not* "launch" any threads. The callback functions
passed as parameters to these functions run in the same thread that
runs the main loop in question. (That might of course be a different
thread than the one where you called g_idle_add() or g_timeout_add(),
but anyway, no new thread creation is involved.)


> > nevertheless, this new thread can
> > not run with your main thread simultaneously.
>   

"can not" or "should not"? threads that can not run simultaneously
would be rather pointless, I think;) Anyway,  if your following text
is based on the wrong belief that g_idle_add() or g_timeout_add()
create new threads, it is pointless to try to understand what you try
to say.

--tml

===========================================

Thanks for your reply. I think I make a mistake about the concept. Following is 
my summary:
1) g_idle_add() or g_timeout_add() is not related to "thread", but related to 
"event-loop".
2) When you call the sleep() function in the callback function of g_idle_add or 
g_time_add, your whole program will wait;
 When you call the sleep() in other "thread", the whole program will not wait.
3) Would the callback function be called till gtk_main() being called? (you can 
examine the example below )

--------------------
#include <glib.h>

static gpointer cursor_change(gpointer data_pass)//2
//static gboolean cursor_change(gpointer data_pass)//1
{
        //1 ---
        /*fprintf(stderr, "In cursor_change\n");
        sleep(10);
        return TRUE;*/

        //2 ---
        gint i=0;
        
        while(1)
        {
                gdk_threads_enter();
                fprintf(stderr, "thread:%d\n", i++);
                sleep(10);
                gdk_threads_leave();
        }
}

void callback (GtkButton* pbtn, gpointer data)
{
        fprintf(stderr, "In Button Callback\n");
}

int main( int argc, char *argv[] )
{
    
        gtk_init (&argc, &argv);
        if (!g_thread_supported ())
        {
                g_thread_init(NULL);
                gdk_threads_init();
        }       
        //1 ---
        //g_idle_add( cursor_change, NULL);
        //2 ---
        //g_timeout_add(1, cursor_change, NULL);
        //3 ---
        g_thread_create ( cursor_change, NULL, FALSE, NULL);
        
        //5 ---
        //sleep(100);
        //6
        GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        GtkWidget *button = gtk_button_new_with_mnemonic ("button");
        g_signal_connect (G_OBJECT (button), "clicked",  G_CALLBACK (callback), 
NULL);
        gtk_widget_show (button);
        gtk_container_add (GTK_CONTAINER (window), button);
        gtk_widget_show (window);
 
        gtk_main ();
        return 0;
}


-- 
Sincerely,
Alfred Young
R&D, Application Architectures
www.foxitsoftware.com

_______________________________________________
gtk-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to