Re: [glade--]Can glade-- use multi-threading???

Christof Petig <[email protected]>
Newsgroups gmane.comp.gnome.glademm
Organization Adolf Petig GmbH & Co. KG
Message-ID <[email protected]>
[email protected] schrieb:
> I am currently having two problems with a glade window I made.
> 1. I have a start and stop button.  The stop button nor any part of the
> window will allow me to do anything until the start button process is
> completely finished.  The start button process can last over 20 minutes and
> I have no way to get the stop button to execute till the start process is
> complete.
> 2. My second problem is very similar.  I have a treeview that displays many
> rows.  I made a generic program to try solving this problem.  The treeview
> runs on a loop which counts from 1 to 10000. The treeview is to display a
> row everytime you get to 100.  However, it will display all 100 rows when
> the process is finished.  I need it to display the rows as I add them to
> the treeview.  Also I would like the window to not erase all it's contents
> in it, when I place a window over it while it's running and then remove the
> window to only see a blank window.
> I have tried using pthreads and forking the process but keep coming up with
> various errors.  I cannot seem to pthread the buttons because a pthread is
> calls a function, and the button is called by the button1.signal.clicked().

You have three options:

- explicitely process events during the loop
- use an idle function (single threaded but interruptable)
- use a multithreading environment.

Since gtk+/glib only recently started to get reentrant (as of cvs HEAD, 
IIRC) multithreading is not yet as comfortable as it should be. Usual 
practice is to set up a dedicated GUI thread which communicates with the 
other via structures (see http://www.gtkmm.org/gtkmm2/examples/thread/ 
). See quotations at end.

Putting
   while(Gtk::Main::events_pending()) Gtk::Main::iteration() ;
in your loop makes your program receive events during long running 
calculations. You might set a flag to stop the computation within the 
stop callback and test for it in the loop.

And finally an idle connection is the most elegant single threaded 
solution I know of. You postpone work to idle time. See one of the many 
idle examples out there (I usually chose this variant). But be careful 
to not mix up multiple idle connections (e.g. save the matching 
connection for disconnecting). This is usually for list filling and 
tasks like that.

I hope this helps
    Christof

-----
Xlib itself is not thread safe/reentrant ...

Quoting Yoey Yandle (gtkmm mailing list)
> It's a very bad idea to make GUI calls from more than one thread.  This
> works sometimes in C, but seldom works from gtkmm.  The standard wisdom 
> is to have your worker threads send signals (pipes work well here) to the 
> GUI thread, which does all the gtkmm calls.

Quoting Paul Davis (gtkmm mailing list)
> all calls to gdk/gtk/Xlib functions should either be protected by a
> mutex, or made from a single thread.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.