什么时候发出GTK信号

时间:2018-03-12 01:19:41

标签: c gtk signals

给定从用户连接到回调函数的信号,gtk_main线程将休眠,直到发出信号。我搜索了有关它如何或何时被发射的详细信息,但找不到任何我不知道的信息。

更具体地说,它是异步发射的,这样我可以在某个函数的中间调用信号,或者等待特定函数先返回?从GThread中发出“switch-page”信号(例如使用gtk_notebook_remove_page())可能会产生奇怪的影响,因为事件发生在主线程中,我不能保证在主上下文中执行gtk_notebook_remove_page()如果使用g_main_context_invoke()?但是如果我在线程内部用g_signal_emit()手动发出信号(如果信号在那条路上是可发射的)会怎么样?

1 个答案:

答案 0 :(得分:2)

首先,gtk mainloop不是线程安全的。它可以从除mainloop之外的线程调用任何gtk函数。

详细说明可以找到here,但简而言之:mainloop不会睡觉或等待信号。它总是在迭代,如果它看到,那个用户按下了一个按钮,就会发出一个信号。

我个人使用这种函数,它们是g_timeout_add' ed:

static gboolean
redrawer (gpointer data)
{
   MyObj *self = data;

   if (g_atomic_int_get (&self->priv->request_redraw)
     gtk_widget_queue_draw (GTK_WIDGET (self));

  return G_SOURCE_CONTINUE;
}
  

更具体地说,它是异步发射的,这样我可以在某个函数的中间调用信号,或者等待特定函数先返回?

等待。当你处于主循环中时,没有什么是异步的。

  

发出"切换页面" GThread中的信号(例如gtk_notebook_remove_page())可能会产生奇怪的影响,因为事件发生在主线程中,我不能保证在主上下文中执行gtk_notebook_remove_page(),好像使用了g_main_context_invoke()一样?   但是如果我在线程内部使用g_signal_emit()手动发出信号(如果信号在那条路上是可发射的)会怎么样?

我不太明白这两个问题,但是再一次:调用gtk函数而不是来自mainloop是UB。