0

因为我正在编写一个在面对其他配置时表现完全不同的“通用”应用程序,所以即使我在启动时还不知道它们,我也被迫显示 gtk 窗口。可能还需要多个窗口需要同时可见(不是模态对话框,而是独立窗口)。但是,如果可以在启动时简单地启动一个 gtk 事件循环,那就太好了。

是否可以在启动后以某种方式将窗口添加到该循环?虽然我发现Gtk::Application该类似乎完全支持缩进行为,但我被限制使用Gtk::Main该类。

4

1 回答 1

1

只允许一个 Gtk::Main 对象。小部件应该在运行主事件循环的同一线程中创建。要解决此限制,您需要开发一种将窗口创建命令传递给 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);
}
于 2012-06-04T22:59:51.853 回答