繁体   English   中英

什么时候发出GTK信号

[英]When are GTK signals emitted

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

更具体地说,它是异步发出的,以便我可以在某个函数中间调用信号,或者它等待特定函数首先返回? 从GThread内部发出“切换页”信号(例如gtk_notebook_remove_page() )可能会产生奇怪的效果,因为事件发生在主线程中,并且我不能保证gtk_notebook_remove_page()在主上下文中执行,就好像g_main_context_invoke()用来? 但是,如果我在线程内部使用g_signal_emit()手动发出信号该g_signal_emit() (如果该信号可以通过这种方式发出)?

首先,gtk mainloop不是线程安全的。 从除主循环之外的其他线程调用任何gtk函数都是UB。

可以在此处找到详细描述,但总之: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()手动发出信号该怎么办(如果该信号可以通过这种方式发出)?

我不太理解这两个问题,但同样:UB不是从mainloop调用gtk函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM