2009-07-14 36 views
2

目前我正在開發一個多線程應用程序。我使用TreeView來顯示每個線程的狀態,每個線程一行。 主要有兩類:如何從外部函數更新Gtk :: TreeModel :: Row

  1. 主GUI包含類樹視圖
  2. 類線程處理

傳遞的Gtk :: TreeModel的:迭代作爲參數傳遞給第二類是不可行的,因爲我們無法以行格式[m_Columns.m_id]訪問行中的元素。 使用Glib :: Dispatcher也是不可用的,因爲我們在外部函數中改變的元素是線程特定的。

那麼,有沒有從外部功能更新GUI的實用方法?

+0

不確定這裏的問題是什麼,真的。問題是GtkTreeModel本身的更新問題,還是您想從不同於擁有GUI的線程更新的問題? – unwind 2009-07-14 11:11:01

+0

對不起,我英語很差......我的意思是第二個。 – 2009-07-14 11:29:54

回答

2

它可用於爲外部文件中的列聲明一個類,並將該文件包含在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類A柱的實例m_columns,並通過它作爲參數傳遞給Thread類,你可以使用

(*row)[m_columns.m_id] 

訪問的元素TreeModel的。

+0

目前還不清楚它是您的解決方案還是評論/精確度。如果它包含在問題中而不是答案中。 StackOverflow不是一個論壇... – neuro 2009-07-16 17:34:57

0

我認爲你應該重新考慮你的架構。最簡單和最安全的方法是讓你的線程以線程安全的方式將信息發送給將收集它們的類。然後讓你的GUI線程讀取這些信息,更改你的treevien然後刷新。

我在一個大的gtkmm /多線程應用程序中使用這個範例。請記住,集中您的同步代碼總是更好。

我希望它有幫助。