【发布时间】:2011-11-18 16:14:12
【问题描述】:
GTK 不是线程安全的,而是线程感知的——它可以在多个线程中使用,确保使用全局锁来保护 GTK API 调用。如果我需要从工作线程向 GTK GUI 线程发布消息,我只需调用 gdk_threads_add_idle() 并在一段时间后在 GUI 线程中调用指定的回调。
但是做相反事情的简单方法是什么 - 当用户单击按钮时从 non-GUI 线程调用指定的回调?
【问题讨论】:
-
您能提供更多详细信息吗?当您说回调时,您的意思是
G(tk)Object的信号处理程序要从non-GUI应用程序触发吗?通过gdk_thread_add_idle()添加的函数是在事件队列中没有更高优先级的事件挂起时触发的......所以“一段时间后”会在函数被调用之前发生变化:) -
@another 我希望我的代码在单独的用户单击 GUI 按钮时执行。我真的不在乎这个
code是C函数、GTK 对象方法还是其他什么。当然,我可以通过为 GTK 事件编写标准处理程序来手动完成,在这种情况下,将一些消息放入我自己的查询和单独的线程中,我可以使用一些代码来等待队列中的消息并调用一些处理程序来处理它。但它的代码很多,不如gdk_threads_add_idle()优雅:) -
当您说 GUI 按钮时,假设它是
GtkWidget是否安全? GTK 中的 AFAIK 如果您必须检测用户单击 GUI 按钮之类的事件,它是通过信号机制实现的;触发事件回调以指示特定事件已发生(可能不是即时的,您可能非常清楚)。因此,对于“按钮单击”,您将有一个事件回调,您将在其中执行所需的操作(阻塞/非阻塞)。您是否对在事件处理程序中创建线程有疑问?或者您想了解没有事件处理程序的“按钮单击”吗? -
请查看developer.gnome.org/glib/2.29/glib-Thread-Pools.html:
... reusing already started threads seems like a good idea. And it indeed is, but implementing this can be tedious and error-prone. Therefore GLib provides thread pools for your convenience. An added advantage is, that the threads can be shared between the different subsystems of your program, when they are using GLib.To create a new thread pool, you use g_thread_pool_new(). It is destroyed by g_thread_pool_free(). If you want to execute a certain task within a thread pool, you call g_thread_pool_push().HTH -
我已经阅读了所有的 cmets 并且我一定遗漏了一些东西,您想要的是一种在您的 GUI 和您的工作线程之间传递消息的方法,并且您不想实现自己的消息队列,因为它有很多代码?正确的 ?。为什么不用这个:,GAsyncQueue,已经实现了