2

Gtk::TreeModelColumn に大規模な (おそらくそれほど多くない - 数千のエントリ) データセットを入力する必要があります。アプリケーションをロックせずにそれを行うにはどうすればよいですか。処理を別のスレッドに入れても安全ですか? では、アプリケーションのどの部分をロックで保護する必要がありますか? Gtk::TreemodelColumn クラスだけですか、それとも Gtk::TreeView ウィジェットに配置されているのでしょうか、それとも周囲のフレームやウィンドウでさえありますか?

4

1 に答える 1

2

2 つの一般的な方法があります。(免責事項: サンプル コードを提供しようとしましたが、gtkmm を使用することはめったにありません。C の GTK に精通しています。ただし、原則は同じです。)

1 つは、アイドル関数を使用することです。これは、GUI で何も起きていないときに実行されます。最良の結果を得るには、ツリービューに 1 つの項目を追加するなど、idle 関数で少量の計算を行います。アイドル関数から戻るtrueと、利用可能な処理時間が増えるたびに再度呼び出されます。を返すfalseと、再度呼び出されることはありません。アイドル関数の良いところは、何もロックする必要がないことです。したがって、次のようにアイドル関数を定義できます。

bool fill_column(Gtk::TreeModelColumn* column)
{
    // add an item to column
    return !column_is_full();
}

次に、次のようにプロセスを開始します。

Glib::signal_idle().connect(sigc::bind(&fill_column, column));

もう 1 つのアプローチは、スレッドを使用することです。C API では、これには と の関係が含まgdk_threads_enter()れますが、gtkmm でこれを行う適切な方法はGlib::Dispatcher. 私はこれまでにそれを使用したことがありませんが、ここにその例があります。ただし、ここで指摘されているように、gtkmm で C API を引き続き使用することもできます。

于 2011-02-16T22:45:56.873 に答える