如何通过g_idle_add()传递多个参数?

时间:2013-12-20 01:57:13

标签: c gtk

我正在尝试将g_idle_add()用于需要多个参数的函数。我可以以某种方式内联传递它们,还是必须为此创建一个结构?

主要目标是减少内存消耗,其他一切都是次要的。

static gboolean checker(gpointer plugin, int toggle){
    ...  
    return FALSE;
}
g_idle_add(checker, ??? plugin, 0 ??? );

1 个答案:

答案 0 :(得分:3)

传递给g_idle_add的函数需要具有与GSourceFunc类型匹配的签名,这意味着它必须只接受一个指针参数。您必须在堆上分配一个结构(不是作为评论者建议的堆栈,只有在创建它的函数运行时才有效)包含您需要的信息。像这样:

struct checker_arguments {
    gpointer plugin;
    int toggle;
};

static gboolean checker(gpointer data) {
    struct checker_arguments *args = data;
    /* Do stuff with args->plugin and args->toggle */
    g_slice_free1(args, sizeof(*args));
    return FALSE;
}

struct checker_arguments *args = g_slice_alloc(sizeof(*args));
args->plugin = plugin;
args->toggle = 0;
g_idle_add(checker, args);

由于您关注内存消耗,我在此示例中使用slice allocation而不是普通heap allocation。对于固定大小的对象,切片分配更有效。