给定从用户连接到回调函数的信号,gtk_main线程将休眠,直到发出信号。我搜索了有关它如何或何时被发射的详细信息,但找不到任何我不知道的信息。
更具体地说,它是异步发射的,这样我可以在某个函数的中间调用信号,或者等待特定函数先返回?从GThread中发出“switch-page”信号(例如使用gtk_notebook_remove_page()
)可能会产生奇怪的影响,因为事件发生在主线程中,我不能保证在主上下文中执行gtk_notebook_remove_page()
如果使用g_main_context_invoke()
?但是如果我在线程内部用g_signal_emit()
手动发出信号(如果信号在那条路上是可发射的)会怎么样?
答案 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。