<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >I'm doing some stuff with GTK+ in a separate thread, and properly locking with gdk_threads_enter/gdk_threads_leave() but the display doesn't update properly. [GTK 2.x]</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="GTK+ FAQ" HREF="book1.html"><LINK REL="UP" TITLE="Development with GTK+: general questions" HREF="c466.html"><LINK REL="PREVIOUS" TITLE="Is GTK+ thread safe? How do I write multi-threaded GTK+ applications? [GTK 2.x]" HREF="x472.html"><LINK REL="NEXT" TITLE="What's an easy way to run a function in the thread with the main loop? [GTK 2.x]" HREF="x490.html"></HEAD ><BODY CLASS="SECT1" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >GTK+ FAQ</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="x472.html" ACCESSKEY="P" ><<< Previous</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >Development with GTK+: general questions</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="x490.html" ACCESSKEY="N" >Next >>></A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="SECT1" ><H1 CLASS="SECT1" ><A NAME="AEN482" >I'm doing some stuff with GTK+ in a separate thread, and properly locking with gdk_threads_enter/gdk_threads_leave() but the display doesn't update properly. <I CLASS="EMPHASIS" >[GTK 2.x]</I ></A ></H1 ><P >For efficiency, the X window system batches up commands and sends them to the X server in batches instead of sending out immediately.</P ><P >In a non-multithreaded program, you don't have to worry about this, since the first thing that happens when control returns to the main loop is that any outstanding X requests are sent to the X server.</P ><P >However, if you are making GTK+ calls from a thread other than the main loop, then GTK+ doesn't know when to send batched commands out. For that reason, after making GTK+ calls in a separate thread, it is usually a good idea to call gdk_flush() before gdk_thread_leave().</P ><P >Actually, gdk_flush() is more expensive than is necessary here, since it waits for the X server to finish outstanding commands as well; if performance is an issue, you may want to call XFlush() directly:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><PRE CLASS="PROGRAMLISTING" > #include <gdk/gdkx.h> void my_flush_commands (void) { GdkDisplay *display = gdk_display_get_default (); XFlush (GDK_DISPLAY_XDISPLAY (display); }</PRE ></TD ></TR ></TABLE ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="x472.html" ACCESSKEY="P" ><<< Previous</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="book1.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="x490.html" ACCESSKEY="N" >Next >>></A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Is GTK+ thread safe? How do I write multi-threaded GTK+ applications? <I CLASS="EMPHASIS" >[GTK 2.x]</I ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="c466.html" ACCESSKEY="U" >Up</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >What's an easy way to run a function in the thread with the main loop? <I CLASS="EMPHASIS" >[GTK 2.x]</I ></TD ></TR ></TABLE ></DIV ></BODY ></HTML >