Come riempire Gtk :: TreeModelColumn con un grande insieme di dati senza bloccare l'applicazione

StackOverflow https://stackoverflow.com/questions/3879703

  •  28-09-2019
  •  | 
  •  

Domanda

Ho bisogno di riempire un grande (forse non così tanto - diverse migliaia di voci) di dati a un Gtk :: TreeModelColumn. Come faccio a farlo senza bloccare l'applicazione. E 'sicuro di mettere la trasformazione in thread separato? Quali parti dell'applicazione Devo proteggere con un blocco, allora? E 'solo la classe Gtk :: TreemodelColumn, o Gtk :: TreeView widget di esso è collocato in, o forse anche circonda frame o la finestra?

È stato utile?

Soluzione

Ci sono due approcci generali si poteva prendere. (Disclaimer:. Ho provato a fornire codice di esempio, ma io uso raramente gtkmm - Io sono molto più familiarità con GTK in C. I principi rimangono gli stessi, però)

Una è quella di utilizzare un inattività funzione - che corre ogni volta che nulla è accadendo nel vostro GUI. Per ottenere risultati ottimali, fare una piccola quantità di calcolo nella funzione di stand-by, come l'aggiunta di un articolo al vostro albero. Se si torna true dalla funzione di inattività, allora si chiama di nuovo ogni volta che non v'è più tempo di elaborazione disponibili. Se si torna false, allora esso non è chiamato di nuovo. La buona parte di funzioni di inattività è che non c'è bisogno di nulla di blocco. Così si può definire la funzione di inattività in questo modo:

bool fill_column(Gtk::TreeModelColumn* column)
{
    // add an item to column
    return !column_is_full();
}

quindi avviare il processo in questo modo:

Glib::signal_idle().connect(sigc::bind(&fill_column, column));

L'altro approccio è quello di utilizzare i thread. Nel API C, ciò comporterebbe gdk_threads_enter() e gli amici, ma mi risulta che il modo corretto di farlo in gtkmm, è quello di utilizzare Glib::Dispatcher. Non ho usato prima, ma qui è un esempio di esso. Tuttavia, è anche possibile ancora utilizzare l'API C con gtkmm, come fuori punte qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top