2010-03-30 12 views
14

Mam wątek roboczy spawned z GUI (dla wydajności GUI), w jaki sposób uzyskać dostęp do GUI, takich jak tworzenie nowych okien/widgetów z samego wątku?Jak uzyskać dostęp do GUI (GTK) z wielu wątków?

Próbowałem używać delegatów, ale wygląda na to, że nie działa. Jakieś pomysły? Możliwe przykłady? Dziękuję Ci.

+0

Delegaci nie działają !? Czy używasz metody Control.BeginInvoke() do wywoływania delegatów? – Cipi

+0

Nie zrobiłem, możesz to rozwinąć? – nubela

+5

Należy pamiętać, że używa on GTK, a nie Windows Forms, więc interfejs API jest inny (patrz poniżej). –

Odpowiedz

31

według ich Best Practices:

Gtk # nie jest bezpieczny wątku narzędzi, co oznacza, że ​​tylko jeden wątek na raz można bezpiecznie wywołać metody na Gtk #. Wątek ten jest zwykle wątkiem wykonującym pętlę główną (czyli wtedy, gdy kontrola została jawnie przekazana do Gtk).

Gdy programiści aplikacji muszą aktualizować wątki w jakimś elemencie graficznego interfejsu użytkownika, muszą albo uzyskać blokadę, która pozwala im wywołać wywołania narzędzia Gtk # toolkit, albo mogą wykonać ich kod w tym samym wątku, co jeden wątek która wykonuje główną pętlę.

Aby wywołać metodę w głównym wątku GTK + i uniknąć problemów z wątkiem w GTK, możesz użyć metody Gtk.Application.Invoke() (jeśli celujesz w Gtk # 1.0, możesz użyć Gtk.ThreadNotify).

Podany jest następujący przykład; powinieneś użyć Invoke, aby wykonać dowolny kod Gtk z głównej pętli:

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

To działa! Potrafię przyjąć ans w 1 min, daj mi to min;) Ponadto, przegłosowano! – nubela

+0

Dzięki, cieszę się, że ci pomogło :) –

+0

Jak zrobić to samo w gtkmm? – fnc12

Powiązane problemy