[gtkmm] Threading Errors
- From: Glenn Pierce <glennpierce connectfree co uk>
 
- To: gtkmm-list <gtkmm-list gnome org>
 
- Subject: [gtkmm] Threading Errors
 
- Date: Fri, 13 Aug 2004 19:03:51 +0100
 
Hi
I have had success updating a progress bar though two threads using a
Gtk::Dispatcher. However, I need to get the same results using
gdk_threads_enter / leave.
I have attached a test program that creates a window in the main GUI
thread with a progress bar. This progress bar is then updated from a
separate thread. I have tried placing gdk_threads_enter and leave
functions around the Gtk functions of the progress bar. However, I must
be missing something as I keep getting
Xlib: unexpected async reply (sequence 0xac)!
I would be grateful for any advice on what I doing wrong.
Thanks
Glenn Pierce
#include <glibmm.h>
#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <gtkmm/progressbar.h>
#include <iostream>
class ProgressBarDialog : public Gtk::Window
{
  public:
    ProgressBarDialog();
    void set_fraction(double progress);
  private:
    Gtk::ProgressBar *progress_bar;
};
ProgressBarDialog::ProgressBarDialog() : Gtk::Window(Gtk::WINDOW_TOPLEVEL)
{
    gdk_threads_enter();
    this->set_default_size(400, 50);
    // Create the ProgressBar
    progress_bar = new Gtk::ProgressBar();
    this->set_fraction(0);
    add(*progress_bar);
    gdk_flush();
    gdk_threads_leave();
}
void ProgressBarDialog::set_fraction(double progress)
{
    gdk_threads_enter();
    this->progress_bar->set_fraction( progress );
    gdk_flush();
    gdk_threads_leave();
}
void launch_thread(ProgressBarDialog *progress)
{
    Glib::Rand rand;
    int usecs = 50;
    for(int i = 0; i < 1000; ++i)
    {
      Glib::usleep(usecs);
      progress->set_fraction((i / 1000));
    }
}
int main(int argc, char** argv)
{
    Glib::thread_init();
    //gdk_threads_init();
    Gtk::Main main_instance (&argc, &argv);
    //gdk_threads_enter();
    ProgressBarDialog *dialog = new ProgressBarDialog();
    dialog->show_all();
    //gdk_flush();
    //gdk_threads_leave();
    Glib::Thread::create( sigc::bind<ProgressBarDialog *>( sigc::ptr_fun(&launch_thread), dialog), true);
    gdk_threads_enter();
    Gtk::Main::run(*dialog);
    gdk_threads_leave();
    delete dialog;
    return 0;
}
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]