2

現在、マルチスレッド アプリケーションを開発しています。TreeView を使用して、各スレッドの状態をスレッドごとに 1 行で表示します。主に次の 2 つのクラスがあります。

  1. TreeView を含むメイン GUI クラス
  2. スレッド処理のクラス

行 [m_Columns.m_id] のような形式の行の要素にアクセスできないため、Gtk::TreeModel::iterator を引数として 2 番目のクラスに渡すことは実行できません。外部関数で変更する要素はスレッド固有であるため、Glib::Dispatcher を使用することもできません。

では、外部関数から GUI を更新する実用的な方法はありますか?

4

2 に答える 2

2

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

好き

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);
    }
};

そのため、GUIクラスでColumnsインスタンスm_columnsを作成し、それをパラメーターとしてスレッドクラスに渡した場合は、次を使用できます。

(*row)[m_columns.m_id]

TreeModelの要素にアクセスします。

于 2009-07-16T02:23:23.740 に答える
0

アーキテクチャを再考する必要があると思います。最も簡単で安全な方法は、スレッドが情報を収集するクラスにスレッド セーフな方法で情報を送信することです。次に、GUI スレッドにこれらの情報を読み取らせ、treevien を変更してから更新します。

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

お役に立てば幸いです。

于 2009-07-16T17:33:30.673 に答える