Re: Multiple threads and drawing



Gtk::Label::set_text() definitely causes a redraw of the label in question. Gtk::Table::attach() will probably cause an immediate redraw of the Table in question as well as the new child. You should check your code for GUI calls from a non-main thread.

2008/6/18 Germán Diago <germandiago gmail com>:
Hello. I'm trying to draw the GUI in gtkmm through a dispatcher, since
I cannot do it from multiple threads.
The program behaves strangely. Sometimes it shows the images, others
get stuck and other it does not show
the table at all.

I have multiple threads that calculate thumbnails of images. The
program creates a Table to contain the images.
Once an image is available (which is calculated by worker threads) , a
signal containing the image is sent from that thread
so that it can be put inside the table. Inside the slot Ithat handles
a new thumbnail available I attach the image  to the table and then
call the dispatcher(),
which calls show_all().
Is this correct?

The (simplified) code is something like this:

class GUI : public Gtk::Window
{
private:
  Glib::Dispatcher d_;
  Gtk::Table * table_;
  Gtk::Button buttonprocessimages_;
  Gtk::Label l_;
  ThreadPool & pool_;

  void onImageAvailable(...)
  {
      table_->attach(*img, row, col,...);
      d_();

  }

  void redraw()
  {
     show_all();
  }
  void processImages()
  {
      table_ = Gtk::Manage(new Gtk::Table(........
      pool_.set_max_threads(n);
      send_work_to_process...
      label_.set_text("");

      buttonprocessimages_.set_sensitive(false);
  }
public:
  GUI(Glib::ThreadPool & pool) : pool_(pool)
  {
    buttonprocessimages_.connect(sigc::mem_fun(*this, &GUI::processImages));
    signal_image_available.connect(sigc::mem_fun(*this,
&GUI::onImageAvailable));
     d_.connect(sigc::mem_fun(*this, &GUI::redraw));

  }
};


int main(int argc, char * argv[])
{
  Gtk::Main m(argc, argv);
  Glib::thread_init();

  Glib::ThreadPool pool;

  GUI gui(pool);
  pool_.set_max_threads(2);

  Gtk::Main::run(gui);

  return 0;
}

Can help, please? Maybe I'm drawing implicitly when I use
label.set_text() or table_.attach() from a non-GUI thread?
Thanks for you time.
_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org
http://mail.gnome.org/mailman/listinfo/gtkmm-list



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]