2013-03-26 5 views
0

나는 vala 클래스에서이 문제를 다루는 데 거의 문제가 없습니다. 여기 이 이해할 수없는 동작이

내 코드입니다 : (build_and_send1 및 build_and_send2는 신호 버튼을 눌러 제기되는)

using GLib; 
using Gtk; 

public class Main : Object 
{ 

    /* 
    * Uncomment this line when you are done testing and building a tarball 
    * or installing 
    */ 
    //const string UI_FILE = Config.PACKAGE_DATA_DIR + "/" + "gtk_httpclient.ui"; 
    const string UI_FILE = "src/gtk_httpclient.ui"; 

    /* ANJUTA: Widgets declaration for gtk_httpclient.ui - DO NOT REMOVE */ 


    private Builder builder; 

    public Main() 
    { 

     try 
     { 
      this.builder = new Builder(); 
      this.builder.add_from_file (UI_FILE); 
      this.builder.connect_signals (this); 

      var window = this.builder.get_object ("window") as Window; 
      /* ANJUTA: Widgets initialization for gtk_httpclient.ui - DO NOT REMOVE */ 
      window.show_all(); 

      stderr.printf ("constructor:\n"); 
      stderr.printf ("this: %p\n", this); 
      stderr.printf ("builder: %p\n", this.builder); 
     } 
     catch (Error e) { 
      stderr.printf ("Could not load UI: %s\n", e.message); 
     } 

    } 

    [CCode (instance_pos = -1)] 
    public void on_destroy (Widget window) 
    { 
     Gtk.main_quit(); 
    } 

    public void build_and_send1 (Widget button) 
    { 
     stderr.printf ("\nbuild_and_send1:\n"); 
     stderr.printf ("this: %p\n", this); 
     stderr.printf ("builder: %p\n", this.builder); 
    } 

    [CCode (instance_pos = -1)] 
    public void build_and_send2 (Widget button) 
    { 
     stderr.printf ("\nbuild_and_send2:\n"); 
     stderr.printf ("this: %p\n", this); 
     stderr.printf ("builder: %p\n", this.builder); 
    } 

    static int main (string[] args) 
    { 
     Gtk.init (ref args); 
     new Main(); 

     Gtk.main(); 

     return 0; 
    } 
} 

내가이 출력있어 :

constructor: 
this: 0x1a524a0 
builder: 0x1a6a230 

build_and_send1: 
this: 0x1aa2030 
builder: 0x5a4fe823 

build_and_send2: 
this: 0x1a524a0 
Program has been terminated receiving signal 11 (Segmentation fault) 

가 나는 같은하려는 경우 가정을 내 신호의 Main 인스턴스는 [CCode (instance_pos = -1)] 앞에 와야합니다. 그렇다면 의 목표는 무엇입니까? builder.connect_signals (this);?

그리고 this.builder는 build_and_send2 아닌 생성자에서의 세그먼트 오류를 ​​제기하는 이유?

+0

나는 Anjuta 3.6.2와 Glade 3.14.2 –

답변

0

아마도 new Main()의 결과는 구성 및 가비지 수집 후 범위를 벗어납니다. 변수에 지정하십시오.

+0

Thx를 사용하여 설명합니다. 빌더를 정적 변수로 선언하는 문제를 해결했습니다. –

0

나는 이것이 어떻게 작동하는지 조금 더 이해합니다.

내 프로젝트에서 UI 이벤트를 처리하기 위해 UIHandler 클래스를 만들었습니다.

이 클래스의 인스턴스를 생성자 안에 연결하면 작동하지 않지만 클래스 외부의 인스턴스를 연결하면 제대로 작동합니다.

Wrong : 세그먼트 오류로 종료됩니다.

// Constructor 
public UIHandler (Builder builder) { 
    var button = builder.get_object ("send-button") as Button; 
    Object (button: button); 

    bulder.connect_signals (this); 
} 
... 
[CCode (instance_pos = -1)] 
public void activate (Entry location) { 
    this.button.clicked(); 
} 

올바른 경우 :이 메시지가 표시됩니다.

Main 클래스 :

public Main() 
{ 

    try 
    { 
     var builder = new Builder(); 
     builder.add_from_file (UI_FILE); 

     builder.connect_signals (new UIHandler (builder)); 

     var window = builder.get_object ("window") as Window; 

     /* ANJUTA: Widgets initialization for gtk_http_client.ui - DO NOT REMOVE */ 
     window.show_all(); 
    } 
    catch (Error e) { 
     stderr.printf ("Could not load UI: %s\n", e.message); 
    } 

} 

uiHandler로서 등급 :

// Constructor 
public UIHandler (Builder builder) { 
    var button = builder.get_object ("send-button") as Button; 
    Object (button: button); 
} 
... 
[CCode (instance_pos = -1)] 
public void activate (Entry location) { 
    this.button.clicked(); 
} 

이 behavoir 내 원래의 문제를 해결합니다.

+0

그게 왜 작동하는지 오해하는 것 같습니다. Gtk.Builder.connect_signals가 void *를 취한다는 사실에 달려 있습니다. Vala는 현재 포인터에 값을 전달할 때 메모리 관리를 거의 무시하므로 매개 변수는 소유 한 매개 변수 또는 전달한 항목에 따라 소유되지 않은 매개 변수처럼 작동합니다. connect_signals 호출에서 UIHandler의 새로운 인스턴스를 생성하기 때문에 Vala는 이것을 소유 된 매개 변수로 취급합니다. UIHandler 생성자에서 "(소유 한)"을 사용하여 참조를 전송하거나 GLib.Object.ref를 수동으로 호출하여 비슷한 효과를 얻을 수 있습니다. – nemequ

+0

이 응답을 게시 한 직후에 소유 및 소유되지 않은 인스턴스에 대해 읽었습니다. 내 생각을 확인해. Thx는 설명을 위해 나중에 시험해 보겠습니다. –