如何使用g_timeout_add()?

问题描述 投票:0回答:1

我在使用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;
}

主要...

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));

在运行程序时出现分段错误。

c timeout gtk3
1个回答
0
投票

让我们看一下g_timeout_addGSourceFunc的手册。

我们看到了:

gboolean
(*GSourceFunc) (gpointer user_data);

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

这意味着您的代码中有2个基本错误:

gboolean time_handler(GtkWidget *widget, GtkWidget *sum) 
  1. 您的函数不遵循GSourceFunc的定义,因为它只能接受1个单个参数。编译器可能已告知您有关此错误的信息,因为您已将代码强制转换为正确的类型。如果使用正确的类型,则不需要强制类型转换。

如果GTK没有将2个参数传递给您的函数(它应该如何知道无效的函数签名?),但是您访问该参数并尝试将其作为指针取消引用,则会调用未定义的行为,此行为表现为分段错误。情况。

  1. 您尝试通过1参数传递2指针。正如编译器告诉您的那样,左操作数根本没有任何作用。

如果要传递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.
© www.soinside.com 2019 - 2024. All rights reserved.