[osg-submissions] [osg-users] Threading problem when using two viewers

Wiedemann, Rudolf, OPS3 rudolf.wiedemann at mbda-systems.de
Tue Jun 3 10:50:23 PDT 2008


Hi Robert,

thank you very much for the hint!

Using CompositeViewer would be better, but I need a solution with two Viewers, too.

I extended the osgViewer::Viewer class as you suggested (see attachment, based on OSG revision 8402).

There are three new methods:
  setMakeCurrentHint() // sets flag _makeCurrentHint
  getMakeCurrentHint()
  makeCurrent() // makes all graphics contexts current
and method
  osgViewer::ViewerBase::frame()
is overloaded.  // osgViewer::Viewer::frame() calls "makeCurrent()" if "_makeCurrentHint" is true before calling osgViewer::ViewerBase::frame()

I hope, I've done the changes correctly!
The following test code works now with the extended osgViewer::Viewer class:

#include <osg/ref_ptr>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgGA/TrackballManipulator>

int main( int argc, char * argv[] )
{
 // read model
 osg::ref_ptr< osg::Node > model = osgDB::readNodeFile( "cow.osg" );

 // create viewer #1
 osg::ref_ptr< osgViewer::Viewer > viewer1 = new osgViewer::Viewer;  
 viewer1->setSceneData( model.get() );
 viewer1->setUpViewInWindow( 10, 10, 400, 300 );
 viewer1->setCameraManipulator( new osgGA::TrackballManipulator() );
 viewer1->setThreadingModel( osgViewer::Viewer::SingleThreaded );
 viewer1->setMakeCurrentHint();

 // create viewer #2
 osg::ref_ptr< osgViewer::Viewer > viewer2 = new osgViewer::Viewer;  
 viewer2->setSceneData( model.get() );
 viewer2->setUpViewInWindow( 500, 10, 200, 300 );
 viewer2->setCameraManipulator( new osgGA::TrackballManipulator() );
 viewer2->setThreadingModel( osgViewer::Viewer::SingleThreaded );
 viewer2->setMakeCurrentHint();

 // render
 while( ( viewer1->done() == false ) && ( viewer2->done() == false ) )  
{
   viewer1->frame();
   viewer2->frame();
 }

 return 0;
}

Rudi

-----Ursprüngliche Nachricht-----
Von: osg-users-bounces at lists.openscenegraph.org [mailto:osg-users-bounces at lists.openscenegraph.org] Im Auftrag von Robert Osfield
Gesendet: Dienstag, 3. Juni 2008 16:51
An: OpenSceneGraph Users
Betreff: Re: [osg-users] Threading problem when using two viewers

Hi Rudolf,

The lazy makeCurrent() calling on each new frame is probably the cause of problem here.  To fix this we'd probably need a hint to osgViewer::Viewer to always call makeCurrent on a new frame.

As a general note, you should use a single CompositeViewer composed of two views, rather than two separate viewers like you have done here - your type of usage is exactly what CompositeViewer was written for.

Robert.

On Tue, Jun 3, 2008 at 3:20 PM, Wiedemann, Rudolf, OPS3 <rudolf.wiedemann at mbda-systems.de> wrote:
> Hi,
>
> when I create two instances of "osgViewer::Viewer" in one program, 
> then the first viewer freezes (no trackball manipulation possible) 
> when setting threading model of both viewers to "SingleThreaded". Is 
> that expected behaviour and why, or is it a bug?
> When I'm setting one or both viewer(s) to e.g. "ThreadPerContext", 
> then both viewers are working properly.
>
> I'm using OSG-Rev. 8402 and OpenSUSE-10.2-64.
>
> Thanks in advance!
> Rudi
>
>
> The following code reproduces the problem:
>
> #include <osg/ref_ptr>
> #include <osgDB/ReadFile>
> #include <osgViewer/Viewer>
> #include <osgGA/TrackballManipulator>
>
> int main( int argc, char * argv[] )
> {
>  // read model
>  osg::ref_ptr< osg::Node > model = osgDB::readNodeFile( "cow.osg" );
>
>  // create viewer #1
>  osg::ref_ptr< osgViewer::Viewer > viewer1 = new osgViewer::Viewer;  
> viewer1->setSceneData( model.get() );  viewer1->setUpViewInWindow( 10, 
> 10, 400, 300 );  viewer1->setCameraManipulator( new 
> osgGA::TrackballManipulator() );  viewer1->setThreadingModel( 
> osgViewer::Viewer::SingleThreaded ); //  viewer1->setThreadingModel( 
> osgViewer::Viewer::ThreadPerContext );
>
>  // create viewer #2
>  osg::ref_ptr< osgViewer::Viewer > viewer2 = new osgViewer::Viewer;  
> viewer2->setSceneData( model.get() );  viewer2->setUpViewInWindow( 
> 500, 10, 200, 300 );  viewer2->setCameraManipulator( new 
> osgGA::TrackballManipulator() );  viewer2->setThreadingModel( 
> osgViewer::Viewer::SingleThreaded ); //  viewer2->setThreadingModel( 
> osgViewer::Viewer::ThreadPerContext );
>
>  // render
>  while( ( viewer1->done() == false ) && ( viewer2->done() == false ) )  
> {
>    viewer1->frame();
>    viewer2->frame();
>  }
>
>  return 0;
> }
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.
> org
>
_______________________________________________
osg-users mailing list
osg-users at lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Viewer
Type: application/octet-stream
Size: 4537 bytes
Desc: Viewer
URL: <http://lists.openscenegraph.org/pipermail/osg-submissions-openscenegraph.org/attachments/20080603/a00ce7d3/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Viewer.cpp
Type: application/octet-stream
Size: 38989 bytes
Desc: Viewer.cpp
URL: <http://lists.openscenegraph.org/pipermail/osg-submissions-openscenegraph.org/attachments/20080603/a00ce7d3/attachment-0003.obj>


More information about the osg-submissions mailing list