📄 gdk-threads.html
字号:
G_UNLOCK (yes_or_no); if (say_something) { /* get GTK thread lock */ gdk_threads_enter (); /* set label text */ if(data->what == YES_IT_IS) gtk_label_set_text (GTK_LABEL (data->label), "O yes, it is!"); else gtk_label_set_text (GTK_LABEL (data->label), "O no, it isn't!"); /* release GTK thread lock */ gdk_threads_leave (); } } return NULL;}int main (int argc, char *argv[]){ GtkWidget *window; GtkWidget *label; yes_or_no_args yes_args, no_args; pthread_t no_tid, yes_tid; /* init threads */ g_thread_init (NULL); gdk_threads_init (); gdk_threads_enter (); /* init gtk */ gtk_init(&argc, &argv); /* init random number generator */ srand ((unsigned int) time (NULL)); /* create a window */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* create a label */ label = gtk_label_new ("And now for something completely different ..."); gtk_container_add (GTK_CONTAINER (window), label); /* show everything */ gtk_widget_show (label); gtk_widget_show (window); /* create the threads */ yes_args.label = label; yes_args.what = YES_IT_IS; pthread_create (&yes_tid, NULL, argument_thread, &yes_args); no_args.label = label; no_args.what = NO_IT_IS_NOT; pthread_create (&no_tid, NULL, argument_thread, &no_args); /* enter the GTK main loop */ gtk_main (); gdk_threads_leave (); return 0;}</pre></div></div><div class="refsect1" lang="en"><a name="id3281287"></a><h2>Details</h2><div class="refsect2" lang="en"><a name="id3281297"></a><h3><a name="GDK-THREADS-ENTER:CAPS"></a>GDK_THREADS_ENTER()</h3><a class="indexterm" name="id3281311"></a><pre class="programlisting">#define GDK_THREADS_ENTER()</pre><p>This macro marks the beginning of a critical section in which GDK andGTK+ functions can be called safely and without causing raceconditions. Only one thread at a time can be in such a critialsection. The macro expands to a no-op if <ahref="/usr/share/gtk-doc/html/glib/glib-Threads.html#G-THREADS-ENABLED:CAPS"><span class="type">G_THREADS_ENABLED</span></a> has notbeen defined. Typically <a class="link" href="gdk-Threads.html#gdk-threads-enter"><code class="function">gdk_threads_enter()</code></a> should be used instead ofthis macro.</p></div><hr><div class="refsect2" lang="en"><a name="id3281352"></a><h3><a name="GDK-THREADS-LEAVE:CAPS"></a>GDK_THREADS_LEAVE()</h3><a class="indexterm" name="id3281365"></a><pre class="programlisting">#define GDK_THREADS_LEAVE()</pre><p>This macro marks the end of a critical section begun with <a class="link" href="gdk-Threads.html#GDK-THREADS-ENTER:CAPS"><span class="type">GDK_THREADS_ENTER</span></a>.</p></div><hr><div class="refsect2" lang="en"><a name="id3281390"></a><h3><a name="gdk-threads-init"></a>gdk_threads_init ()</h3><a class="indexterm" name="id3281402"></a><pre class="programlisting">void gdk_threads_init (void);</pre><p>Initializes GDK so that it can be used from multiple threadsin conjunction with <a class="link" href="gdk-Threads.html#gdk-threads-enter"><code class="function">gdk_threads_enter()</code></a> and <a class="link" href="gdk-Threads.html#gdk-threads-leave"><code class="function">gdk_threads_leave()</code></a>.<ahref="/usr/share/gtk-doc/html/glib/glib-Threads.html#g-thread-init"><code class="function">g_thread_init()</code></a> must be called previous to this function.</p><p>This call must be made before any use of the main loop fromGTK+; to be safe, call it before <ahref="/usr/share/gtk-doc/html/gtk/gtk-General.html#gtk-init"><code class="function">gtk_init()</code></a>.</p><p></p></div><hr><div class="refsect2" lang="en"><a name="id3281476"></a><h3><a name="gdk-threads-enter"></a>gdk_threads_enter ()</h3><a class="indexterm" name="id3281489"></a><pre class="programlisting">void gdk_threads_enter (void);</pre><p>This macro marks the beginning of a critical section in which GDK andGTK+ functions can be called safely and without causing raceconditions. Only one thread at a time can be in such a critialsection.</p></div><hr><div class="refsect2" lang="en"><a name="id3281514"></a><h3><a name="gdk-threads-leave"></a>gdk_threads_leave ()</h3><a class="indexterm" name="id3281527"></a><pre class="programlisting">void gdk_threads_leave (void);</pre><p>Leaves a critical region begun with <a class="link" href="gdk-Threads.html#gdk-threads-enter"><code class="function">gdk_threads_enter()</code></a>. </p></div><hr><div class="refsect2" lang="en"><a name="id3281559"></a><h3><a name="gdk-threads-mutex"></a>gdk_threads_mutex</h3><a class="indexterm" name="id3281574"></a><pre class="programlisting">extern GMutex *gdk_threads_mutex; /* private */</pre><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p><code class="literal">gdk_threads_mutex</code> is deprecated and should not be used in newly-written code.</p></div><p>The <ahref="/usr/share/gtk-doc/html/glib/glib-Threads.html#GMutex"><span class="type">GMutex</span></a> used to implement the critical region for<a class="link" href="gdk-Threads.html#gdk-threads-enter"><code class="function">gdk_threads_enter()</code></a>/<a class="link" href="gdk-Threads.html#gdk-threads-leave"><code class="function">gdk_threads_leave()</code></a>. </p></div><hr><div class="refsect2" lang="en"><a name="id3281633"></a><h3><a name="gdk-threads-set-lock-functions"></a>gdk_threads_set_lock_functions ()</h3><a class="indexterm" name="id3281649"></a><pre class="programlisting">void gdk_threads_set_lock_functions (<ahref="/usr/share/gtk-doc/html/gobject/gobject-Closures.html#GCallback">GCallback</a> enter_fn, <ahref="/usr/share/gtk-doc/html/gobject/gobject-Closures.html#GCallback">GCallback</a> leave_fn);</pre><p>Allows the application to replace the standard method thatGDK uses to protect its data structures. Normally, GDKcreates a single <ahref="/usr/share/gtk-doc/html/glib/glib-Threads.html#GMutex"><span class="type">GMutex</span></a> that is locked by <a class="link" href="gdk-Threads.html#gdk-threads-enter"><code class="function">gdk_threads_enter()</code></a>,and released by <a class="link" href="gdk-Threads.html#gdk-threads-leave"><code class="function">gdk_threads_leave()</code></a>; using this function anapplication provides, instead, a function <em class="parameter"><code>enter_fn</code></em> that iscalled by <a class="link" href="gdk-Threads.html#gdk-threads-enter"><code class="function">gdk_threads_enter()</code></a> and a function <em class="parameter"><code>leave_fn</code></em> that iscalled by <a class="link" href="gdk-Threads.html#gdk-threads-leave"><code class="function">gdk_threads_leave()</code></a>.</p><p>The functions must provide at least same locking functionalityas the default implementation, but can also do extra applicationspecific processing.</p><p>As an example, consider an application that has its own recursivelock that when held, holds the GTK+ lock as well. When GTK+ unlocksthe GTK+ lock when entering a recursive main loop, the applicationmust temporarily release its lock as well.</p><p>Most threaded GTK+ apps won't need to use this method.</p><p>This method must be called before <a class="link" href="gdk-Threads.html#gdk-threads-init"><code class="function">gdk_threads_init()</code></a>, and cannotbe called multiple times.</p><p></p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><p><span class="term"><em class="parameter"><code>enter_fn</code></em> :</span></p></td><td> function called to guard GDK</td></tr><tr><td><p><span class="term"><em class="parameter"><code>leave_fn</code></em> :</span></p></td><td> function called to release the guard</td></tr></tbody></table></div><p class="since">Since 2.4</p></div><hr><div class="refsect2" lang="en"><a name="id3281827"></a><h3><a name="gdk-threads-add-idle"></a>gdk_threads_add_idle ()</h3><a class="indexterm" name="id3281843"></a><pre class="programlisting"><ahref="/usr/share/gtk-doc/html/glib/glib-Basic-Types.html#guint">guint</a> gdk_threads_add_idle (<ahref="/usr/share/gtk-doc/html/glib/glib-The-Main-Event-Loop.html#GSourceFunc">GSourceFunc</a> function, <ahref="/usr/share/gtk-doc/html/glib/glib-Basic-Types.html#gpointer">gpointer</a> data);</pre><p>A wrapper for the common usage of <a class="link" href="gdk-Threads.html#gdk-threads-add-idle-full"><code class="function">gdk_threads_add_idle_full()</code></a> assigning the default priority, <ahref="/usr/share/gtk-doc/html/glib/glib-The-Main-Event-Loop.html#G-PRIORITY-DEFAULT-IDLE:CAPS"><span class="type">G_PRIORITY_DEFAULT_IDLE</span></a>.</p><p>See <a class="link" href="gdk-Threads.html#gdk-threads-add-idle-full"><code class="function">gdk_threads_add_idle_full()</code></a>.</p><p></p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><p><span class="term"><em class="parameter"><code>function</code></em> :</span></p></td><td> function to call</td></tr><tr><td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td><td> data to pass to <em class="parameter"><code>function</code></em></td></tr><tr><td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td><td> the ID (greater than 0) of the event source.</td></tr></tbody></table></div><p class="since">Since 2.12</p></div><hr><div class="refsect2" lang="en"><a name="id3281976"></a><h3><a name="gdk-threads-add-idle-full"></a>gdk_threads_add_idle_full ()</h3><a class="indexterm" name="id3281991"></a><pre class="programlisting"><ahref="/usr/share/gtk-doc/html/glib/glib-Basic-Types.html#guint">guint</a> gdk_threads_add_idle_full (<ahref="/usr/share/gtk-doc/html/glib/glib-Basic-Types.html#gint">gint</a> priority, <ahref="/usr/share/gtk-doc/html/glib/glib-The-Main-Event-Loop.html#GSourceFunc">GSourceFunc</a> function, <ahref="/usr/share/gtk-doc/html/glib/glib-Basic-Types.html#gpointer">gpointer</a> data, <ahref="/usr/share/gtk-doc/html/glib/glib-Datasets.html#GDestroyNotify">GDestroyNotify</a> notify);</pre>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -