Glib - 中断foreach

时间:2018-02-06 20:05:08

标签: foreach glib

我有很长的收藏 - GList(大量的样本)。为验证我使用g_list_foreach的每个样本。整个清单的处理持续很长时间。有时中断处理(通过系统信号SIGINT)非常有用。有没有办法打断foreach函数?

1 个答案:

答案 0 :(得分:1)

实现像g_list_foreach这样会在每次迭代中检查一个标志的东西是微不足道的,那么你只需要安装一个信号处理程序来设置标志。

以下是the entire implementation of g_list_foreach

void
g_list_foreach (GList    *list,
                GFunc     func,
                gpointer  user_data)
{
  while (list)
    {
      GList *next = list->next;
      (*func) (list->data, user_data);
      list = next;
    }
}

如何安装处理程序将取决于您希望如何构建应用程序,但如果没有别的,您可以使用GOnce来安装处理程序,如下所示:

static volatile gboolean my_flag = FALSE;

static void
handle_sigint(int id) {
  my_flag = TRUE;
}

static gpointer
install_handler(gpointer data)
{
  signal(SIGINT, handle_sigint);
  return NULL;
}

/* Returns FALSE if interrupted, TRUE otherwise. */
gboolean
my_g_list_foreach (GList    *list,
                   GFunc     func,
                   gpointer  user_data)
{
  static GOnce handler_once = G_ONCE_INIT;
  g_once(&handler_once, install_handler, NULL);

  my_flag = FALSE;

  while (list)
    {
      if (flag)
        return FALSE;

      GList *next = list->next;
      (*func) (list->data, user_data);
      list = next;
    }

    return TRUE;
}