2009-07-14 5 views
2

Derzeit entwickle ich eine Multi-Thread-Anwendung. Ich verwende eine TreeView, um die Zustände jedes Threads anzuzeigen, eine Zeile pro Thread. Es gibt im Wesentlichen zwei Klassen:Wie aktualisiere ich Gtk :: TreeModel :: Row von externen Funktion

  1. Haupt GUI-Klasse enthält TreeView
  2. Klasse für Fadenhandhabungs

Passing Gtk :: TreeModel :: Iterator als Argument für die zweite Klasse ist nicht durchführbar, da Wir können nicht auf die Elemente in der Zeile in Formaten wie der Zeile [m_Columns.m_id] zugreifen. Die Verwendung von Glib :: Dispatcher ist ebenfalls nicht verfügbar, da die Elemente, die wir in der externen Funktion ändern, Thread-spezifisch sind.

Gibt es also eine praktische Methode, GUI von externen Funktionen zu aktualisieren?

+0

Nicht sicher, was die Frage hier wirklich ist. Ist das Problem das Aktualisieren eines GtkTreeModel selbst oder die Tatsache, dass Sie dies von einem anderen Thread als dem, der die GUI besitzt, tun möchten? – unwind

+0

Entschuldigung für mein schlechtes Englisch ... ich meinte das zweite. –

Antwort

2

Es ist verfügbar, eine Klasse für Spalten in einer externen Datei zu deklarieren und die Datei sowohl in die GUI-Klassendatei als auch in die Threadklassendatei aufzunehmen.

Wie

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

So dass, wenn Sie eine Columns Instanz m_columns in GUI-Klasse erstellt wurde, und gab sie als Parameter Klasse einzufädeln, Sie

(*row)[m_columns.m_id] 

verwenden können, um die Elemente Zugang in Baummodell.

+0

Es ist nicht klar, ob es Ihre Lösung oder ein Kommentar/Präzision ist. Wenn es in der Frage nicht in einer Antwort enthalten ist. StackOverflow soll kein Forum sein ... – neuro

+0

Wenn es deine Lösung ist, sei klarer :) – neuro

+0

Ich habe einen Beispielcode hinzugefügt. –

0

Ich denke, dass Sie Ihre Architektur überdenken sollten. Der einfachste und sicherste Weg ist, dass Ihr Thread Informationen in einer Thread-sicheren Weise an eine Klasse sendet, die sie sammelt. Dann machen Sie Ihren GUI-Thread lesen Sie diese Informationen, ändern Sie Ihre Treevien und dann aktualisieren.

Ich benutze dieses Paradigma in einer großen gtkmm/Multithread-Anwendung. Denken Sie daran, dass es immer besser ist, Ihren Synchronisierungscode zu zentralisieren.

Ich hoffe es hilft.

+0

Könnten Sie bitte im Detail erklären, wie Sie die Zeile für jeden Thread finden? –