【问题标题】:passing multiple arguments to a gtk callback function将多个参数传递给 gtk 回调函数
【发布时间】:2015-10-12 11:00:41
【问题描述】:

我正在尝试将多个参数传递给 gtk 回调函数 到目前为止,我有以下代码:

void add_new_set(GtkDialog *dialog, gint response_id, gpointer callback_params)
{
  g_print (gtk_entry_get_text (((struct data *) callback_params)->entry));
}

struct data callback_params;
    callback_params.entry = gtk_entry_new();
    gtk_container_add(GTK_CONTAINER(content_area), callback_params.entry);
    g_signal_connect(dialog,"response",G_CALLBACK (add_new_set),&callback_params);

没有得到 g_print 编辑 我收到以下错误: (tat:5918): Gtk-CRITICAL **: IA__gtk_entry_get_text: 断言 'GTK_IS_ENTRY (entry)' 失败

(tat:5918): GLib-CRITICAL **: g_print: assertion 'format != NULL' failed

我愿意使用传递结构指针以外的技术

谢谢

【问题讨论】:

    标签: c linux gtk


    【解决方案1】:

    您实际上需要将复合数据打包到 堆分配 struct,并将指针传递给回调。

    struct data *cb_data = g_new0(struct data, 1);
    cb_data->entry = gtk_entry_new();
    cb_data->foo = "somefoo";
    g_signal_connect(dialog,"response",G_CALLBACK (add_new_set), cb_data);
    

    但是您可能有一个 static 某个 struct 类型的变量,并将该变量的地址传递给您的回调。这通常是不好的做法,我不建议这样编码(因为您希望回调以某种方式reentrant)。

    您不能获取局部变量的地址并将其传递给 g_signal_connect(因为 GTK 信号处理将在您从函数返回很久之后使用该指针,因此弹出其 call frame)。

    当然,问题是您的程序何时应该释放 cb_data。也许考虑g_signal_connect_data,它有一个destroy_data 关闭通知。或连接另一个信号以释放该数据(可能是 dialog 上的 widget "destroy"dialog "close" ....)。

    您应该考虑使用valgrind 来调试memory leaks

    【讨论】:

    • 完美,我使用静态而不是在堆上分配我认为它应该在函数返回时释放(我的函数在程序运行后立即读取配置文件后返回)我一定会去通过一些 valgrind 教程来确定我是否有任何内存泄漏感谢您的回答,非常感谢您
    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多