[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