하나의 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);
}
기본 창 유형 인 최상위 창을 기본 이벤트 루프에 추가하지 않습니까? – Ivarpoiss
이벤트 루프를 시작하는 Main :: run 메소드를 호출하기 전에 만들어진 경우에만 작동합니다. 임이 루프가 시작된 후 윈도우를 첨부하는 방법인지 묻습니다. – Paranaix
Main :: 다음에 창을 추가 할 수 있습니다 (이벤트 루프에서). 창없이 이벤트 루프를 시작하는 것은 없습니다. 정말로 그렇게하고 싶다면 Main :: iteration을 사용하십시오. 루프를 수동으로 확인하십시오. – Ivarpoiss