C 简单功能的显示响应时间似乎太慢

C 简单功能的显示响应时间似乎太慢,c,gtk,gtk2,C,Gtk,Gtk2,我已经用C编写了一个应用程序,使用GTK2.0为一个触摸屏面板编写了一个应用程序,该面板带有运行DebianLinux的ARM处理器。它是一个非常基本的应用程序,在屏幕上显示几个按钮事件框,可以单击。在一个页面上,我有4个字段来显示一个列表,通过单击向上箭头和向下箭头也可以滚动事件框。我下面的滚动功能代码非常基本…它只是用数组中的下一项更新每个字段。一切都很好,但我看到的问题是,如果你反复点击滚动按钮的速度有点太快,它会跳到前面一些列表项目太远。我的猜测是,当点击过快时,计数器的移动速度超过了屏

我已经用C编写了一个应用程序,使用GTK2.0为一个触摸屏面板编写了一个应用程序,该面板带有运行DebianLinux的ARM处理器。它是一个非常基本的应用程序,在屏幕上显示几个按钮事件框,可以单击。在一个页面上,我有4个字段来显示一个列表,通过单击向上箭头和向下箭头也可以滚动事件框。我下面的滚动功能代码非常基本…它只是用数组中的下一项更新每个字段。一切都很好,但我看到的问题是,如果你反复点击滚动按钮的速度有点太快,它会跳到前面一些列表项目太远。我的猜测是,当点击过快时,计数器的移动速度超过了屏幕的更新速度,所以当你再次点击时,它实际上是在用当时过高的计数器进行更新。如果它只发生在点击速度非常快的时候,我不会担心,但是我认为对于这样一个简单的函数来说,以相当快的速度重复,缓慢的响应似乎是不合适的

我希望可能有人对我在使用GTK刷新屏幕时可能缺少的东西有一些意见

提前感谢您的任何想法或建议

这是我的音量上升功能和滚动上升功能的代码,两者都有相同的问题。具有相应的向下滚动和向下音量功能,具有相同的问题:

static void sr_vol_up_clicked (GtkWidget *fakewidget, GdkEvent *fakeevent, gpointer number)
{

g_timer_start(lock_timer);
gtk_image_set_from_file (GTK_IMAGE(sr_vol_up_button),"./images/Admin/navigation_up_arrow_DOWN.png");

if (sr_current_level < 100)
{
    sr_current_level = sr_current_level + 1;
    gtk_label_set_text (GTK_LABEL(sr_current_level_label), (g_strdup_printf("%i", sr_current_level)));
    set_sr_volume(sr_current_level);
}

gtk_image_set_from_file (GTK_IMAGE(sr_vol_up_button),"./images/Admin/navigation_up_arrow_UP.png");

}
另一方面:

static void scroll_show_up ()
{
g_timer_start(lock_timer);
if (show_scroll_count > 0)
{

    if (show_one_displayed - 1 < 0)
    {
        show_one_displayed = (show_loop_list->len -1);
    }

    else
    {
        show_one_displayed = show_one_displayed - 1;
    }

    gtk_label_set_text (GTK_LABEL(upcoming_show_1_label), get_show_name((char *)g_ptr_array_index(show_loop_list, show_one_displayed)));

    if (show_two_displayed - 1 < 0)
    {
        show_two_displayed = (show_loop_list->len -1);
    }

    else
    {       
        show_two_displayed = show_two_displayed - 1;
    }

    gtk_label_set_text (GTK_LABEL(upcoming_show_2_label), get_show_name((char *)g_ptr_array_index(show_loop_list, show_two_displayed)));

    if (show_three_displayed - 1 < 0)
    {
        show_three_displayed = (show_loop_list->len -1);
    }

    else
    {
        show_three_displayed = show_three_displayed - 1;
    }

    gtk_label_set_text (GTK_LABEL(upcoming_show_3_label), get_show_name((char *)g_ptr_array_index(show_loop_list, show_three_displayed)));

    if (show_four_displayed - 1 < 0)
    {
        show_four_displayed = (show_loop_list->len -1);
    }

    else
    {
        show_four_displayed = show_four_displayed - 1;
    }

    gtk_label_set_text (GTK_LABEL(upcoming_show_4_label), get_show_name((char *)g_ptr_array_index(show_loop_list, show_four_displayed)));

    show_scroll_count = show_scroll_count - 1;

}
}

如果接收到的滚动事件太快,您可以尝试使用事件压缩,即过滤掉或删除滚动事件。这是在运动通知事件的某些应用程序中完成的。GdkWindow-有一个GDK api,但建议不要使用它,除非您知道自己在做什么。计时器的具体用途是什么?嗯……我会查看一下过滤器,但它似乎仍然能够处理每秒1-2次点击的速度,不会有太多麻烦。我会责怪更小的ARM处理器,除非我在我的整个桌面上编译和运行时看到完全相同的结果。定时器锁定定时器是一种非活动监视器,设置为20秒并进入锁定屏幕。每次按下按钮重置时,我都会调用g_timer_start。