2013-02-20 8 views
0

api 호출을 테스트하기 위해 약간의 http 클라이언트를 작성하고 있습니다. 이것은 vala를 배우고 gtk3을 사용하는 경우입니다.개체 인스턴스 및 vala의 신호 처리기로 세분화 오류가 발생했습니다.

나는 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 

표시 할 때마다 "이 # 0x1로"프로그램이 라인에서 세그먼트 오류와 함께 실패

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

UI는

var builder = new Builder(); 
builder.add_from_file (UI_FILE); 
var signals_handler = new RequestHandler(); 
builder.connect_signals (signals_handler); 
빌드입니다

저는 정말 신비예요. e in 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> 
... 

인터페이스 잎이 완전히 생성된다.

+0

ui 파일을 게시하십시오 ... 저는 특히 당신이 on_url_Changed에 연결하려는 신호에 관심이 있습니다. – nemequ

+0

관련 객체와 관련된 UI 파일 부분을 추가했습니다. 이제 porterty를 static으로 변경했습니다. –

답변

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

,처럼 호출 정보에는 버튼 인수에 RequestHandler가 있고 self ("this"변수가 생성되는 방식)는 가비지입니다.

기본적으로 Vala를 우회하여 생성 된 C에 직접 연결하기 때문에 신호를 자동 연결하는 경우 매우 신중해야합니다. Vala는 유형 안전을 제공 할 방법이 없습니다.

+0

Thx, 이제 작동합니다. 그래서, 나는 인스턴스 메소드와 여분의 도구들과 함께 "autoconnected signals"을 사용할 수 없다. 에 좋지 않습니다. –