Как использовать g_timeout_add ()? - PullRequest
0 голосов
/ 04 марта 2020

У меня проблема с использованием g_timeout_add. Я вызываю функцию:

gboolean time_handler(GtkWidget *widget, GtkWidget *sum) {
    if (widget == NULL) return FALSE;
    gchar *display;
    display = g_strdup_printf("%d", globalCounter);         //convert num to str
    gtk_label_set_text (GTK_LABEL(sum), display); //set label to "display"
    g_free(display); 

    return TRUE;
}

main ...

g_timeout_add(1000, (GSourceFunc) time_handler, (window, sum))

Это предупреждение, которое я получаю:

gtkp2.c:66:60: warning: left-hand operand of comma expression has no effect [-Wunused-value]
g_timeout_add(1000, (GSourceFunc) time_handler, (window,sum));

Во время работы программы Я получаю ошибку сегментации.

1 Ответ

0 голосов
/ 04 марта 2020

Давайте посмотрим на руководство для g_timeout_add и GSourceFun c.

Там мы видим:

gboolean
(*GSourceFunc) (gpointer user_data);

и

guint
g_timeout_add (guint interval,
               GSourceFunc function,
               gpointer data);

Это означает, что в вашем коде есть 2 базовых c ошибки:

gboolean time_handler(GtkWidget *widget, GtkWidget *sum) 
  1. Ваша функция не соответствует определению GSourceFunc, поскольку она только разрешено принимать 1 единственный параметр. Компилятор, вероятно, сообщил вам об этой ошибке, потому что в вашем коде приведен правильный тип. Если вы используете правильный тип, преобразование не требуется.

Если GTK не передает 2 параметра вашей функции (как она должна знать о вашей недопустимой сигнатуре функции?), Но вы получаете доступ к этому параметру и попытайтесь разыменовать его как указатель, вы вызываете неопределенное поведение, которое в этом случае проявляется как ошибка сегментации.

Вы пытаетесь передать указатели 2 через параметр 1 . Как сказал вам компилятор, левый операнд вообще не имеет никакого эффекта.

Если вы хотите передать 2 значения, вам нужно определить структуру и передать указатель на такую ​​структуру:

typedef struct{
  GtkWidget *widget,
  GtkWidget *sum
} myParameters; 


gboolean time_handler(gpointer *par) {
  myParams *params = par;
  ...
}
...

myParams param = {widget, sum};
g_timeout_add(1000, time_handler, &params);
// Make sure that lifetime of params does not end before your handler might be called! Local variables in main are OK for this.
...