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