2010-03-30 3 views
14

J'ai un thread de travail généré à partir d'une interface graphique (pour les performances de l'interface graphique), comment puis-je accéder à l'interface graphique, comme générer de nouvelles fenêtres/widgets à partir du thread lui-même?Comment accéder à l'interface graphique (GTK) à partir de plusieurs threads?

J'ai essayé d'utiliser des délégués mais cela ne semble pas fonctionner. Des idées? Peut-être des exemples? Je vous remercie.

+0

Les délégués ne fonctionnent pas !? Utilisez-vous la méthode Control.BeginInvoke() pour appeler des délégués? – Cipi

+0

Je ne l'ai pas fait, pouvez-vous élaborer là-dessus? – nubela

+5

S'il vous plaît gardez à l'esprit qu'il utilise GTK, pas Windows Forms, donc l'API est différente (voir ci-dessous). –

Répondre

31

Selon leur Best Practices:

Gtk # est pas une boîte à outils de thread-safe, ce qui signifie qu'un seul thread à la fois peut en toute sécurité appeler des méthodes sur Gtk #. Ce thread est généralement le thread exécutant la boucle principale (qui est quand le contrôle a été explicitement transféré à Gtk). Lorsque les développeurs d'applications doivent mettre à jour des éléments de l'interface utilisateur graphique, ils doivent soit acquérir un verrou leur permettant d'émettre des invocations Gtk # toolkit, soit exécuter leur code sur le même thread que le thread. qui exécute la boucle principale.

Pour invoquer une méthode sur le thread de boucle principale GTK + et éviter tout problème de threading avec GTK, vous pouvez utiliser la méthode Gtk.Application.Invoke() (si vous ciblez Gtk 1.0, vous pouvez utiliser Gtk.ThreadNotify).

L'exemple suivant est fourni. vous devez utiliser Invoke pour exécuter n'importe quel code Gtk à partir de la boucle principale:

public void ThreadedMethod() 
{ 
    Gtk.Application.Invoke(delegate { 
     do_stuff_in_main_thread(); 
    }); 
} 
+0

Cela fonctionne! Je peux accepter les ans en 1 min, donnez-moi ce min;) Aussi, upvoted! – nubela

+0

Merci, content que cela vous a aidé :) –

+0

Comment faire la même chose dans gtkmm? – fnc12

Questions connexes