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:

  
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
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

  
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to