2010-03-30 3 views
14

Ich habe einen Worker-Thread von einer GUI (für GUI-Leistung) erzeugt, wie greife ich auf GUI, wie zum Beispiel neue Windows/Widgets aus dem Thread selbst hervorbringen?Wie greife ich von mehreren Threads auf die GUI (GTK) zu?

Ich versuchte Delegaten, aber es scheint nicht zu funktionieren. Irgendwelche Ideen? Vielleicht Beispiele? Vielen Dank.

+0

Delegierte arbeiten nicht !? Verwenden Sie die Methode Control.BeginInvoke() zum Aufrufen von Delegaten? – Cipi

+0

Ich habe nicht, können Sie das näher ausführen? – nubela

+5

Bitte beachten Sie, dass er GTK verwendet, nicht Windows Forms, daher ist die API anders (siehe unten). –

Antwort

31

Nach ihrer Best Practices:

GTK # ist kein Thread-safe-Toolkit, was bedeutet, dass nur ein Thread zu einem Zeitpunkt sicher Methoden auf GTK # aufrufen kann. Dieser Thread ist normalerweise der Thread, der die Hauptschleife ausführt (wenn die Kontrolle explizit zu Gtk übertragen wurde).

Wenn Anwendungsentwickler Threads einige Elemente der grafischen Benutzeroberfläche aktualisieren müssen, müssen sie entweder eine Sperre erwerben, mit der sie Gtk # toolkit-Aufrufe ausführen können, oder sie können ihren Code im selben Thread ausführen wie der eine Thread das führt die Hauptschleife aus.

Um eine Methode im GTK + -Main-Loop-Thread aufzurufen und Threading-Probleme mit GTK zu vermeiden, können Sie die Gtk.Application.Invoke() -Methode verwenden (wenn Sie Gtk # 1.0 als Ziel haben, können Sie Gtk.ThreadNotify verwenden).

Das folgende Beispiel wird bereitgestellt; Sie sollten Invoke verwenden, um jeden Gtk-Code innerhalb der Hauptschleife auszuführen:

+0

Es funktioniert! Ich kann die Ansage in 1 Min annehmen, gib mir das Min;) Auch Upvoted! – nubela

+0

Danke, froh, dass es dir geholfen hat :) –

+0

Wie mache ich dasselbe in gtkmm? – fnc12