2009-07-14 10 views
2

現在、私はマルチスレッドアプリケーションを開発しています。私は各スレッドの状態、スレッドごとに1行を表示するためにTreeViewを使用します。 あり、主に二つのクラスです:処理スレッド用外部関数からGtk :: TreeModel :: Rowを更新するには

  1. メインGUIクラス含むツリービュー
  2. クラスはGtk :: TreeModelのを渡す::イテレータを第二のクラスへの引数として

は以来、実行可能ではありません行[m_Columns.m_id]のような書式で行の要素にアクセスすることはできません。 外部関数で変更された要素がスレッド固有であるため、Glib :: Dispatcherの使用も利用できません。

したがって、外部関数からGUIを更新する方法はありますか?

+0

実際に質問がここにあるかどうかはわかりません。問題はGtkTreeModel自体の更新か、GUIを所有しているスレッドとは別のスレッドからそうしたいという事実ですか? – unwind

+0

貧しい私の英語のために申し訳ありません...私は第二のものを意味しました。 –

答えて

2

外部ファイルのColumnsクラスを宣言し、そのファイルをGUIクラスファイルとスレッドクラスファイルの両方に含めることができます。

あなたはGUIクラスの列のインスタンスm_columnsを作成し、クラスをスレッドし、それをパラメータとして渡された場合、あなたは内の要素にアクセスするために

(*row)[m_columns.m_id] 

を使用できるように

class Columns : public Gtk::TreeModel::ColumnRecord 
{ 
public: 
    Gtk::TreeModelColumn<unsigned int> m_id; 
    Gtk::TreeModelColumn<Glib::ustring> m_pin; 
    Gtk::TreeModelColumn<Glib::ustring> m_name; 
    Gtk::TreeModelColumn<unsigned int> m_percentage; 
    Gtk::TreeModelColumn<Glib::ustring> m_status; 

    Columns() 
    { 
     add(m_id); 
     add(m_pin); 
     add(m_name); 
     add(m_percentage); 
     add(m_status); 
    } 
}; 

のようにTreeModel。

+0

それがあなたの解であるかコメントであるか正確であるかは不明です。それが答えではない質問に含めるならば。 StackOverflowはフォーラムになるためのものではありません... – neuro

+0

あなたの解決策なら、より明確になります:) – neuro

+0

私はいくつかのサンプルコードを追加しました。追加の説明/サンプルコードについては –

0

私はあなたのアーキテクチャを考え直すべきだと思います。最もシンプルで安全な方法は、スレッドが情報をスレッドセーフな方法でクラスを収集するクラスに送信することです。その後、あなたのGUIスレッドがそれらの情報を読んで、あなたのツリービーンを変更してから更新してください。

このパラダイムは大きなgtkmm /マルチスレッドアプリケーションで使用します。同期コードを集中させる方が常に良いことに注意してください。

私はそれが役に立ちそうです。

+0

詳細を教えてください、各スレッドの行を見つける方法は? –

関連する問題