2010-10-07 5 views
2

J'ai besoin de remplir un grand ensemble de données (peut-être pas beaucoup - plusieurs milliers d'entrées) vers un Gtk :: TreeModelColumn. Comment puis-je faire cela sans bloquer l'application. Est-il sûr de mettre le traitement dans un fil séparé? Quelles parties de l'application dois-je protéger avec une serrure alors? Est-ce seulement la classe Gtk :: TreemodelColumn, ou le widget Gtk :: TreeView dans lequel il est placé, ou peut-être même entoure le cadre ou la fenêtre?Comment remplir Gtk :: TreeModelColumn avec un grand ensemble de données sans verrouiller l'application

+0

Le contenu est-il généré de manière dynamique lors de l'exécution du programme? Sinon, vous pourriez avoir l'objet 'TreeModelColumn' pré-calculé au début. –

+0

non, le contenu est généré dynamiquement –

Répondre

2

Il existe deux approches générales possibles. (Disclaimer: J'ai essayé de fournir un exemple de code, mais j'utilise rarement gtkmm - Je suis beaucoup plus familier avec GTK en C. Les principes restent les mêmes, cependant.)

Un est d'utiliser un idle function - que s'exécute chaque fois que rien ne se passe dans votre interface graphique. Pour de meilleurs résultats, effectuez une petite quantité de calculs dans la fonction inactive, comme ajouter un élément à votre vue arborescente. Si vous renvoyez true à partir de la fonction inactive, elle est appelée à nouveau chaque fois que le temps de traitement disponible est plus long. Si vous renvoyez false, il n'est pas appelé à nouveau. La bonne chose à propos des fonctions inactives est que vous n'avez rien à verrouiller. Ainsi, vous pouvez définir votre fonction de veille comme ceci:

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

commencer ensuite le processus comme celui-ci:

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

L'autre approche consiste à utiliser les threads. Dans l'API C, cela impliquerait gdk_threads_enter() et des amis, mais je suppose que la bonne façon de faire cela dans gtkmm, est d'utiliser Glib::Dispatcher. Je ne l'ai pas utilisé auparavant, mais here en est un exemple. Cependant, vous pouvez toujours utiliser l'API C avec gtkmm, comme indiqué here.

Questions connexes