2010-03-30 14 views
14

Ho un thread di lavoro generato da una GUI (per prestazioni della GUI), come accedo alla GUI, come ad esempio la generazione di nuove finestre/widget dal thread stesso?Come accedere alla GUI (GTK) da più thread?

Ho provato a utilizzare i delegati ma non sembra funzionare. Qualche idea? Forse esempi? Grazie.

+0

I delegati non funzionano !? Utilizzi il metodo Control.BeginInvoke() per richiamare i delegati? – Cipi

+0

Non l'ho fatto, puoi approfondire? – nubela

+5

Tieni presente che sta utilizzando GTK, non Windows Form, quindi l'API è diversa (vedi sotto). –

risposta

31

Secondo il loro Best Practices:

Gtk # non è un toolkit thread-safe, il che significa che solo un thread alla volta può richiamare in modo sicuro metodi su Gtk #. Questo thread è in genere il thread che esegue il ciclo principale (ovvero quando il controllo è stato trasferito esplicitamente a Gtk).

Quando gli sviluppatori di applicazioni devono avere thread che aggiornano alcuni elementi dell'interfaccia utente grafica devono acquisire un blocco che permetta loro di generare invocazioni di toolkit Gtk # o possono eseguire il loro codice sullo stesso thread di un thread che esegue il ciclo principale.

Per richiamare un metodo sul thread del ciclo principale GTK + ed evitare problemi di threading con GTK, è possibile utilizzare il metodo Gtk.Application.Invoke() (se si utilizza Gtk # 1.0 è possibile utilizzare Gtk.ThreadNotify).

Il seguente esempio è fornito; dovresti usare Invoke per eseguire qualsiasi codice Gtk dal ciclo principale:

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

Funziona! Posso accettare gli ans in 1 minuto, dammi quel minuto;) Inoltre, con le migliori quotazioni! – nubela

+0

Grazie, felice che ti abbia aiutato :) –

+0

Come fare la stessa cosa in gtkmm? – fnc12

Problemi correlati