0

他の構成に直面したときにまったく異なる動作をする「汎用」アプリケーションを作成しているため、起動時にまだgtkウィンドウを知らなくても、gtkウィンドウを表示する必要があります。複数のウィンドウ(モーダルダイアログではなくスタンドアロンウィンドウ)を同時に表示する必要がある場合もあります。しかし、起動時に1つのgtkイベントループを開始できれば素晴らしいと思います。

ループが開始された後、そのループにウィンドウを追加することはどういうわけか可能ですか?Gtk::Applicationインデントされた動作を正確にサポートしているように見えるクラスを見つけましたが、クラスの使用に制限されていますGtk::Main

4

1 に答える 1

1

許可される 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);
}
于 2012-06-04T22:59:51.853 に答える