許可される Gtk::Main オブジェクトは 1 つだけです。ウィジェットは、メイン イベント ループが実行されている同じスレッドで作成する必要があります。この制限を回避するには、ウィンドウ作成コマンドを gtk スレッドに渡す方法を開発する必要があります。
最も簡単な方法は、Glib::Dispatcher を使用することです
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();
Glib::Dispatcher は引数を取らないので、次のステップはスレッド間で引数を渡す方法を理解することです。
さまざまなタイプのウィンドウに対して、さまざまなディスパッチャを使用できます。
boost::asio::io_service は、メッセージをやり取りするのに役立ちます。
while(!exit) {
io_service.reset();
io_service.poll();
while(Gtk::Main::events_pending())
Gtk::Main::iteration();
Sleep(0);
}