I’m trying to write some multi-threaded code in C++, but I can’t seem to get anywhere. I’ve done some research, but I struggle to find some basic examples that would show me how to achieve what I need. I’m working on a Gtk application in Linux and every time there is a time consuming operation, like loading a file, the GUI locks (and if I try to move it all controls etc. disappear just leaving blank windows). This can obviously be solved by threading, but I’m not sure where to even start looking. Should I use pthreads, C++ Thread, boost::Thread, Glib::Thread? What are the differences and reasons to use any of the above?
My aim is to have a message dialog or even a progress bar dialog which would show when there is an operation running in the background. Basically anything that would leave the GUI responsive while the stuff is being done. I’d really appreciate some example or a link to some source code to study.
When you use GTK there are a few things you need to take into account. GTK is thread aware but not thread safe. It provides a global lock controlled by gdk_threads_enter() and gdk_threads_leave() which protects all use of GTK+. That is, only one thread can use GTK+ at any given time. Callbacks require a bit of attention. Callbacks from GTK+ (signals) are made within the GTK+ lock. However callbacks from GLib (timeouts, IO callbacks, and idle functions) are made outside of the GTK+ lock. So, within a signal handler you do not need to call gdk_threads_enter(), but within the other types of callbacks, you do.
Read this for more information:
http://blogs.operationaldynamics.com/andrew/software/gnome-desktop/gtk-thread-awareness
http://www.yolinux.com/TUTORIALS/GTK+ProgrammingTips.html
http://developer.gnome.org/gtk-faq/stable/x481.html
The kind of threads you probably need is a normal worker thread. It leaves the gui responsive while the work is done in the background. The gui then can control the worker thread and also check the worker threads progress with a timerbased check on what its doing and updates to a progress bar or showing a message dialog.
Look at some tutorials for general multi-threading in c++ on linux here:
http://www.tidytutorials.com/2010/06/linux-c-socket-example-with-client.html
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
http://programming-in-linux.blogspot.jp/2008/03/multithreading-example-in-cc-using.html