|
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_ptr<osgViewer::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_lock<boost::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_ptr<osgViewer::Viewer> pViewer, bool* doneFlag, boost::mutex* mutex, boost::condition_variable* cond) { pViewer->run(); boost::lock_guard<boost::mutex> lock(*mutex); *doneFlag = true; cond->notify_all(); } Alfonso Callejo Goena wrote: Cory Riddell <c...@...> writes: |
_______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

