Quoth Andrew Potter: > void gui_print(const Glib::ustring& str) { > /* Get a function pointer to the set_text method we want to > * use. We must explicitly declare the method pointer > * signature because Gtk::TextBuffer::set_text is an > * overloaded method. */ > void (Gtk::TextBuffer::*fptr)(const Glib::ustring&) = > &Gtk::TextBuffer::set_text; > > /* Create a functor that points at the TextBuffer method we > * want to use. Because tb is a Glib::RefPtr and sigc::mem_fun > * needs the actual Gtk::TextBuffer object, we must use > * operator->(). See GNOME Bugzilla #495762. */ > sigc::slot<void, const Glib::ustring&> set_text_functor = > sigc::mem_fun(tb.operator->(), fptr); > > /* Bind the arguments of the functor to create a > * sigc::slot<void> that can be sent to the callback > * dispatcher. > */ > sigc::slot<void> bound_functor = sigc::bind(set_text_functor, > str); > > /* callback_dispatcher can execute any sigc::slot<void> on the > * Main Loop. Since we have one now, send it. > */ > callback_dispatcher.send(bound_functor); > }
Given that sigc magic is hard for many people, you might want to simplify this with a helper method: // Called from the blocking operation in the worker thread void gui_print(const Glib::ustring& str) { sigc::slot<void, const Glib::ustring&> print_functor = sigc::mem_fun(this, &Example::gui_print_ui); sigc::slot<void> bound_functor = sigc::bind(print_functor, str); callback_dispatcher.send(bound_functor); } // Called on the UI thread when the worker thread calls gui_print void gui_print_ui(const Glib::ustring& str) { tb->set_text(str); } This would make it easier for people to modify the actual action taken in gui_print_ui. _______________________________________________ gtkmm-list mailing list gtkmm-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtkmm-list