2013-12-20 3 views
3

Я пытаюсь использовать g_idle_add() с функцией, которая требует нескольких аргументов. Могу ли я передать их как раз встроенным способом или мне нужно создать структуру для этого?Как передать несколько аргументов через g_idle_add()?

Основная цель - уменьшить потребление памяти, все остальное является вторичным.

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

'typedef void * gpointer;' * Нетипизированный указатель. gpointer выглядит лучше и проще в использовании, чем void *. * Yuck ... – this

+0

Можете ли вы рассказать о встроенном? – this

+0

Возможно, не совсем в строке. Без создания выделенной 'struct'. Я бы не хотел увеличивать потребление памяти. –

ответ

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. Распределение фрагментов более эффективно для объектов фиксированного размера.

+0

вместо g_slice_alloc/g_slice_free1 используйте g_slice_new() и g_slice_free() с типом, который вы выделяете. его легче читать и яснее. – ebassi

Смежные вопросы