【问题标题】:segmentation fault with object instance and signal handler in valavala中对象实例和信号处理程序的分段错误
【发布时间】:2013-02-22 03:46:19
【问题描述】:

我正在编写一个小的 http 客户端来测试 api 调用。这是学习vala和使用gtk3的机会。

我做了一个类来处理gtk接口和http请求。

using GLib;
using Gtk;

public class RequestHandler : Object
{
    public string uri { get; private set; default = ""; }

    // Constructor
    public RequestHandler ()
    {
    }

    [CCode (instance_pos = -1)]
    public void on_url_changed (Entry entry, Button button)
    {
        stderr.printf ("this#%p\n", this);
        if (entry.get_text_length () == 0)
        {
            button.set_sensitive (false);
            this.uri = "";
        }
        else
        {
            button.set_sensitive (true);
            this.uri = entry.get_text();
        }
    }

    [CCode (instance_pos = -1)]
    public void on_send_clicked (Button button)
    {
        assert (this.uri != null );
        stderr.printf ("Send request to : %s\n", this.uri);
    }
}

线

stderr.printf ("this#%p\n", this);
// => fprintf (_tmp0_, "this#%p\n", self); in the C file

每次显示“this#0x1”并且程序在该行因分段错误而失败

this.uri = entry.get_text();
// _g_free0 (self->priv->_uri); in the C file

用户界面是用

构建的
var builder = new Builder ();
builder.add_from_file (UI_FILE);
var signals_handler = new RequestHandler ();
builder.connect_signals (signals_handler);

我真的是 vala 的新手,我没有看到我的错误。

[编辑]

...
<object class="GtkEntry" id="entry2">
    <property name="visible">True</property>
    <property name="can_focus">True</property>
    <property name="receives_default">True</property>
    <property name="hexpand">True</property>
    <property name="invisible_char">●</property>
    <property name="input_purpose">url</property>
    <signal name="changed" handler="request_handler_on_url_changed" object="button1" swapped="no"/>
</object>
...

用户界面完全由 glade 生成。

【问题讨论】:

  • 请发布您的 ui 文件...我对您尝试连接到 on_url_Changed 的​​信号特别感兴趣。
  • 我刚刚添加了 UI 文件中涉及到的对象的部分。到目前为止,我只是将 porterty 更改为 static。

标签: gtk3 vala


【解决方案1】:

您在 on_url_changed 方法上有一个额外的参数。 Gtk.Editable.changed 信号应该有一个参数:改变的 Gtk.Editable。由于自动连接信号没有类型安全性,public void on_changed (Gtk.Entry entry); 应该可以工作。

您在上面发布的代码正在生成类似这样的内容:

void request_handler_on_changed (GtkEntry* entry, GtkButton* button, RequestHandler* self) {
  fprintf (stderr, "this#%p\n", self);
}

gtk+ 是这样称呼它的

request_handler_on_changed (editable, request_handler);

因此,当您的 Vala 代码获取信息时,它的按钮参数中有 RequestHandler,而 self(这是“this”变量的生成方式)是垃圾。

在自动连接信号时必须非常小心,因为您基本上是在绕过 Vala 并直接挂钩到生成的 C。Vala 无法提供类型安全。

【讨论】:

  • 谢谢,它现在可以工作了。因此,我不能将“自动连接的信号”与实例方法和额外的 agruments 一起使用。坏了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2018-11-18
  • 2020-10-23
  • 2015-05-01
相关资源
最近更新 更多