2012-06-04 5 views
0

다른 구성에 직면 할 때 완전히 다른 동작을하는 "일반"응용 프로그램을 작성하고 있기 때문에 시작시에 아직 알지 못하더라도 gtk 윈도우를 표시해야합니다. 또한 여러 창을 동시에 볼 수 있어야합니다 (모달 대화 상자가 아니라 독립형 창). 그러나 시작할 때 하나의 gtk 이벤트 루프를 간단히 시작할 수 있다면 좋을 것입니다.Gtkmm : 나중에 윈도우 추가하기

시작한 후 루프에 창을 추가하는 것이 가능합니까? 정확하게 들여 쓰기 된 동작을 지원하는 것으로 보이는 Gtk::Application 클래스를 발견했지만 Gtk::Main 클래스를 사용하도록 제한되었습니다.

+0

기본 창 유형 인 최상위 창을 기본 이벤트 루프에 추가하지 않습니까? – Ivarpoiss

+0

이벤트 루프를 시작하는 Main :: run 메소드를 호출하기 전에 만들어진 경우에만 작동합니다. 임이 루프가 시작된 후 윈도우를 첨부하는 방법인지 묻습니다. – Paranaix

+0

Main :: 다음에 창을 추가 할 수 있습니다 (이벤트 루프에서). 창없이 이벤트 루프를 시작하는 것은 없습니다. 정말로 그렇게하고 싶다면 Main :: iteration을 사용하십시오. 루프를 수동으로 확인하십시오. – Ivarpoiss

답변

1

하나의 Gtk :: Main 객체 만 허용됩니다. 위젯은 메인 이벤트 루프가 실행되는 동일한 스레드에서 만들어 져야합니다.이 제한을 해결하기 위해 창 생성 명령을 gtk 스레드로 전달하는 방법을 개발해야합니다.

가장 간단한 방법은

struct WindowBuilder { 
    /**/ 
    Glib::Dispatcher* signal_create; 

    void create_window() { 
     //From main thread... 
     signal_create->emit(); 
    } 
} 

void create_mainWnd() { 
    new Ui::MainWnd(); 
} 

//From Gtk thread... 
builder->signal_create->connect(sigc::ptr_fun(create_mainWnd)); 

Gtk::Main::run(); 

입심 :: 디스패처

을 사용하는 것입니다 입심 : Dispatcher가 그래서 다음 단계는 스레드간에 주위에 인수를 전달하는 방법을 파악하는 것입니다, 그것으로 인수를하지 않습니다.

다른 창 유형의 경우 다른 디스 텝처를 사용할 수 있습니다.

boost :: asio :: io_service는 메시지를 전달하는 데 도움이 될 수 있습니다.

while(!exit) { 
    io_service.reset(); 
    io_service.poll(); 
    while(Gtk::Main::events_pending()) 
     Gtk::Main::iteration(); 
    Sleep(0); 
}