首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Glib - interrupt foreach

Glib - interrupt foreach
EN

Stack Overflow用户
提问于 2018-02-07 04:05:08
回答 1查看 223关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2018-02-07 06:39:47

实现像g_list_foreach这样的东西很简单,它会在每次迭代时检查一个标志,然后你只需要安装一个信号处理程序来设置标志。

这是the entire implementation of g_list_foreach

代码语言:javascript
复制
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来安装处理程序,如下所示:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48651093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档