如何在长回调期间强制gtk事件

如何在长回调期间强制gtk事件,gtk,glade,Gtk,Glade,我需要一个事件来处理按下和释放我的程序工具栏上的按钮。 我使用按钮按下事件,但当我点击我的按钮时,什么也没有发生 我正在使用Glade界面设计器设计GUI。请为我解释在gtk+中何时调用按钮按下事件&这是我需要的事件吗 “按钮按下事件”应提供鼠标按钮按下。我使用gtk_widget_add_device_events()将按钮按下添加到按钮接收到的事件列表中,但我认为默认情况下应该会得到它们 gboolean on_skip_backward_toolbutton_pressed (GtkWid

我需要一个事件来处理按下和释放我的程序工具栏上的按钮。 我使用按钮按下事件,但当我点击我的按钮时,什么也没有发生

我正在使用Glade界面设计器设计GUI。请为我解释在gtk+中何时调用按钮按下事件&这是我需要的事件吗

“按钮按下事件”应提供鼠标按钮按下。我使用gtk_widget_add_device_events()将按钮按下添加到按钮接收到的事件列表中,但我认为默认情况下应该会得到它们

gboolean
on_skip_backward_toolbutton_pressed (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
    g_print ("pressed");
    timeout_id = g_timeout_add(500, (GSourceFunc) change_freq_timeout, (gpointer) FALSE);

    return FALSE;
}

gboolean
on_skip_forward_toolbutton_pressed(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
    g_print ("pressed");
    timeout_id = g_timeout_add(500, (GSourceFunc) change_freq_timeout, (gpointer) TRUE);

    return FALSE;
}

gboolean
on_skip_toolbutton_released(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
    g_print ("released");
    if (timeout_id) {
        g_source_remove(timeout_id);
        timeout_id = 0;
    }

    return FALSE;
}
change\u freq\u timeout回调有一条指令,需要很长时间才能处理

在超时处理程序中运行mainiteration通常被认为是一个“坏主意”,因为它工作得不太好


是否存在可用于解决问题的其他秘密技术?

是,
按钮按下事件
按钮释放事件
是小部件的低级鼠标事件。按钮通过发出完全不同的信号来处理这些问题;对于GtkToolButton,这是单击的
。你想做什么UI?如果
change\u freq\u timeout
真的卡在一条指令中,那么你首先应该如何处理事件?在GUI程序中,必须执行长时间运行的同步操作。这使得GUI可以自由地处理传入事件,直到操作完成。注意,工作线程不允许执行GTK代码;但是,它可以使用
g_idle_add
通知GUI线程执行某些操作,或者通知它操作的进度。