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