Re: List/TreeStore and threads



Dear Yann,

You can load data to tree store from a worker thread. I have done this once where I am populating a tree store form a jumbo XML file and showing percentage of loading on the UI. I suppose you are also looking for the same.

For cooking this dish you'll need the following.
  1. A UI thread (which you already have),
  2. A worker thread to parse the file and add data to tree store
  3. a Glib::Dispatcher to send completion status updates from worker thread to UI thread
  4. A member variable in your class where the worker thread shares the completion status and
  5. a Glib::Mutex to protect to shared resource.

And this is how you cook it.

  1. Create a member function and connect it to the Glib::Dispatcher object. This function starts with a Glib::Mutex::Lock and displays the percentage completion.
  2. Disconnect the tree view from the tree store. Leaving it connected brings you serious speed issues and additionally its not a good idea to control any UI element from within a thread other than the main thread (gdk_threads_enter and leave never helped me! may be I was doing something wrong altogether).
  3. Start a worker thread (implemented as a private member function of the same class) passing it the file from which to load.
  4. Update the completion variable from the worker thread and trigger the Glib::Dispatcher object as you progress (don't forget about Glib::Mutex::Lock). I would do this once in 250 milliseconds.
  5. Once your loading is complete, connect the tree store back to the tree view.

This should get you started.



regards
Mohith Manoj,
Asst. Manager (R&D),
Skanray Technologies PVT.LTD
Web: www.skanray.com
On 8/2/2013 6:47 PM, Yann Leydier wrote:
Thanks Kevin.

I know of the dispatcher but the problem is that I need to fill a TreeStore: the data is very complex and hard to send through a dispatcher.

Does anyone know if filing a store that is not bound to any TreeView would be ok (out of the main thread, I mean)? Is so, I could just swap the TreeView's store with the new one.

Thanks
yann

On 02/08/13 15:10, Kevin Brightwell wrote:
I'm not entirely sure of your problem, but I do know that GTK does not guarantee any thread safety for it's components. You should not be modifying the TreeView outside the UI thread. If this is how GTK manifests this problem, so be it. There is a Glib::Dispatcher() [1] [2] which would allow you to spawn the dispatcher in the UI thread, then push things from a worker thread and make sure the value gets updated on the UI.

I hope I'm actually helping the problem and not just being critical on style. :(

Cheers,

Kevin

[1] https://developer.gnome.org/glibmm/2.35/classGlib_1_1Dispatcher.html
[2] https://developer.gnome.org/gtkmm-tutorial/3.8/sec-using-glib-dispatcher.html.en



On Fri, Aug 2, 2013 at 8:51 AM, Yann Leydier <yann leydier info> wrote:
Hi,

my application fills some TreeStrores and ListStores at runtime but the data is read from large files and the computation of some values takes time. Therefore I put a progress bar in a splash window and fill the store in another thread.

The TreeView fills oddly: once the lines do not fit anymore on the display, the scollbar is not updated. I tried to add gdk_threads_entrer() and gdk_threads_leave() before and after the calls to XXXStore::append() but it did not change anything.

First question: are the stores really thread unsafe? I tend to consider them as non-UI classes, so TreeView should be the one handling the thread-safety…

Second question: how do I make sure I do not mess up with the thread safety when filling my stores?

Thanks a lot,
yann
_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org
https://mail.gnome.org/mailman/listinfo/gtkmm-list



--
Kevin Brightwell
BESc. and BSc. Candidate 2015
Western University www.westernu.ca
e. kevin brightwell2 gmail com c. 226.678.4927



_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org
https://mail.gnome.org/mailman/listinfo/gtkmm-list



---
avast! Antivirus: Inbound message clean.
Virus Database (VPS): 130802-2, 08/03/2013
Tested on: 8/3/2013 9:05:39 AM
avast! - copyright (c) 1988-2013 AVAST Software.
http://www.avast.com








avast! Antivirus: Outbound message clean.

Virus Database (VPS): 130804-1, 08/05/2013
Tested on: 8/5/2013 10:39:46 AM
avast! - copyright (c) 1988-2013 AVAST Software.




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