markku,

i kept gtk_thread_enter / leave for experimental purpose.
Actually issue was happening irrespective of existence of gtk_thread_enter
/ leave.

Thanks & Regards
--
Lokesh Chakka,
Mobile: 9731023458

On Wed, Sep 16, 2015 at 10:21 AM, markku vire <markku.v...@gmail.com> wrote:

> Hi,
>
> Nowadays gdk_threads_enter ()/leave () are deprecated, so you should not
> use them in newly written code. You need to do gtk calls from main thread
> instead. You can send notifications to main thread easily using g_idle_add,
> which schedules them to happen on next main loop iteration.
>
> When working with older versions of gtk, you need to acquire gdk lock
> before doing any gtk call from background thread. So, you should move
> threads_enter/leave around queue_draw in your thread_function.
>
> Hope this helps,
>
> -Markku-
> 16.9.2015 7.03 "Lokesh Chakka" <lvenkatakumarcha...@gmail.com> kirjoitti:
>
>> hello,
>>
>> I have written small piece of code and I am seeing thread_function is
>> getting stuck. If I try to close the window, I am seeing GLib Critical error
>>
>> Can some body please help me fixing the issue ?
>>
>> following is the code:
>>
>> #include<gtk/gtk.h>
>> #include<cairo.h>
>> #include<stdlib.h>
>> #include <pthread.h>
>>
>> GtkDrawingArea *darea;
>> GtkVBox  *main_window_box;
>> GtkWindow    *main_window;
>>
>> const int size = 500;
>> int i;
>>
>> static void my_draw_event( GtkWidget *widget, cairo_t *cr, void
>> *parameter )
>> {
>>     int a, b;
>>     cairo_set_source_rgb( cr, 1, 0, 0 );
>>     a = random()%size;
>>     b = random()%size;
>>     cairo_move_to( cr, a, a );
>>     cairo_line_to( cr, b, b );
>>     cairo_stroke(cr);
>>     gtk_widget_show_all((GtkWidget*)main_window);
>>     fprintf( stderr, "Values i: %4d a: %3d b: %3d\n", i, a, b );
>> }
>>
>> static void *thread_function( void *parameter )
>> {
>>     const int seconds = 1000;
>>
>>     for( i=0; i<seconds; i++ )
>>     {
>>         gtk_widget_queue_draw( (GtkWidget*)darea );
>>         sleep(1);
>>     }
>> }
>>
>> int main()
>> {
>>     pthread_t th;
>>
>>     gdk_threads_init();
>>     gdk_threads_enter();
>>     gtk_init( NULL, NULL );
>>
>>     main_window = (GtkWindow*)gtk_window_new(GTK_WINDOW_TOPLEVEL);
>>
>> g_signal_connect(G_OBJECT(main_window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
>>
>>     main_window_box = (GtkVBox*)gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
>>     gtk_container_add (GTK_CONTAINER
>> (main_window),(GtkWidget*)main_window_box);
>>
>>     darea = (GtkDrawingArea*)gtk_drawing_area_new();
>>     gtk_box_pack_start( GTK_BOX( main_window_box ), (GtkWidget*)darea,
>> TRUE, TRUE, 0 );
>>     g_signal_connect( G_OBJECT(darea), "draw", G_CALLBACK( my_draw_event
>> ), NULL );
>>
>>     gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_CENTER);
>>     gtk_window_set_default_size(GTK_WINDOW(main_window), size, size );
>>
>>     pthread_create( &th, NULL, thread_function, NULL );
>>     gtk_widget_show_all((GtkWidget*)main_window);
>>     gtk_main();
>>     gdk_threads_leave();
>>
>>     return 0;
>> }
>>
>> Thanks & Regards
>> --
>> Lokesh Chakka,
>> Mobile: 9731023458
>>
>> _______________________________________________
>> gtk-devel-list mailing list
>> gtk-devel-list@gnome.org
>> https://mail.gnome.org/mailman/listinfo/gtk-devel-list
>>
>>
_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-devel-list

Reply via email to