Re: [osg-users] Running viewer loop and physic calculations in different threads
Hi Alfonso, I'm doing something similar to what you are doing. My viewer is running in it's own thread. I have a shared object that I use to communicate between the threads. If you are looking for sample code, I can try to distill what I have to something relatively simple. I'm using the boost threads library. It seems to work quite well and is cross platform. Have you written multi-threaded apps before? Are you familiar with mutexes (mutices?), conditions, volatile variables, spurious wakes, etc...? If you aren't familiar with the boost stuff, I would recommend spending some time getting familiar with it. Aside: if anybody can explain why spurious wakes exist, I'd love to hear an explanation. Cory Alfonso Callejo Goena wrote: Hello everyone: I'm developing a OSG-based graphic engine for a real time mechanical simulator. I would like that the physics and the graphic display would run in separate threads so that they could work independently without bothering each other. The communication between them isa kind of buffer or list to which the physics program pushes the last calculation and the graphic program pulls the appropriate one. I don't know which is the best (and most simple) way of setting up and managing the threads. DoestheosgViewer classhave a way of doing this? Where can I find an example which follows this technique? Thank you, Alfonso ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Running viewer loop and physic calculations in different threads
Cory Riddell c...@... writes: Hi Alfonso, I'm doing something similar to what you are doing. My viewer is running in it's own thread. I have a shared object that I use to communicate between the threads. If you are looking for sample code, I can try to distill what I have to something relatively simple. I'm using the boost threads library. It seems to work quite well and is cross platform. Have you written multi-threaded apps before? Are you familiar with mutexes (mutices?), conditions, volatile variables, spurious wakes, etc...? If you aren't familiar with the boost stuff, I would recommend spending some time getting familiar with it. Aside: if anybody can explain why spurious wakes exist, I'd love to hear an explanation. Cory Hi Cory, I would appreciate very much your sample code, because I don't have much experience in this issue. Did you consider using what Paul has suggested (osgDB::DatabasePager)? In my case the physical calculations are in fact a standalone program, and it is not just loaded data... Thank you very much, Alfonso ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] Running viewer loop and physic calculations in different threads
Alfonso, I've distilled my code down. I hope I haven't cut out too much. The most complicated part for me was getting the halting sequence correct. I tell the viewer to stop drawing and then have to wait until the viewer thread is finished and notifies me that it is complete. I have a view class that "owns" the scene graph and the display. It looks something like: class MyView { private: /// the OSG view onto the scene osg::ref_ptrosgViewer::Viewer m_viewer; /// the thread sets this to {...@code true} when the viewer thread has stopped bool m_viewerThreadStopped; /// the mutex to protect access to {...@link #m_viewerThreadStopped} boost::mutex m_viewerThreadStoppedMutex; /// the condition variable for signalling {...@link #m_viewerThreadStopped} has been set boost::condition_variable m_viewerThreadStoppedCond; public: MyView() : m_viewerThreadStopped(false) { } ~MyView(); void initialize(); ... }; MyView::~MyView() { if (m_viewer) { boost::unique_lockboost::mutex lock(m_viewerThreadStoppedMutex); m_viewer-setDone(true); // this while loop has to be here because of spurious wakes while (!m_viewerThreadStopped) { // unblock and wait for it to signal that it is done running m_viewerThreadStoppedCond.wait(lock); } m_viewer-stopThreading(); } } void MyView::initialize() { // set up the scene graph here ... // start the thread that does the OSG rendering boost::thread(startThread, m_viewer, m_viewerThreadStopped, m_viewerThreadStoppedMutex, m_viewerThreadStoppedCond); } void startThread(osg::ref_ptrosgViewer::Viewer pViewer, bool* doneFlag, boost::mutex* mutex, boost::condition_variable* cond) { pViewer-run(); boost::lock_guardboost::mutex lock(*mutex); *doneFlag = true; cond-notify_all(); } Alfonso Callejo Goena wrote: Cory Riddell c...@... writes: Hi Alfonso, I'm doing something similar to what you are doing. My viewer is running in it's own thread. I have a shared object that I use to communicate between the threads. If you are looking for sample code, I can try to distill what I have to something relatively simple. I'm using the boost threads library. It seems to work quite well and is cross platform. Have you written multi-threaded apps before? Are you familiar with mutexes (mutices?), conditions, volatile variables, spurious wakes, etc...? If you aren't familiar with the boost stuff, I would recommend spending some time getting familiar with it. Aside: if anybody can explain why spurious wakes exist, I'd love to hear an explanation. Cory Hi Cory, I would appreciate very much your sample code, because I don't have much experience in this issue. Did you consider using what Paul has suggested (osgDB::DatabasePager)? In my case the physical calculations are in fact a standalone program, and it is not just "loaded data"... Thank you very much, Alfonso ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org