我有很长的收集- GList (大量的样品)。为了验证我正在使用的g_list_foreach的每个样本。整个列表的处理持续很长时间。有时中断处理非常有用(通过系统信号SIGINT)。有没有办法中断foreach函数?
发布于 2018-02-07 06:39:47
实现像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;
}https://stackoverflow.com/questions/48651093
复制相似问题