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" <lvenkatakumarchakka gmail com> kirjoitti:_______________________________________________Can some body please help me fixing the issue ?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 errorfollowing 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