I've tried a different series of entering "view" one or more times,
followed by closing one or more of the shown windows and repeating. But
I've not seen any "black windows" yet. What is the sequence that
reproduces the problem for you?
This is on Linux, nVidia 96.43.01 driver
Paul
David Johansson wrote:
Hi Robert,
Here is code that produces the problem.
I'm building/running on Ubuntu 8.04 with osg 2.4
#include <iostream>
#include <vector>
#include <string>
#include <osg/Node>
#include <OpenThreads/Thread>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
class viewerThread: public OpenThreads::Thread
{
public:
viewerThread( osg::Node* n ): OpenThreads::Thread(), _scene(n){}
virtual void run(){
osgViewer::Viewer viewer;
_pViewer = &viewer;
viewer.addEventHandler(new osgViewer::StatsHandler());
viewer.addEventHandler(new osgViewer::ThreadingHandler());
viewer.addEventHandler(new osgViewer::WindowSizeHandler());
viewer.setSceneData(_scene);
viewer.setThreadingModel(osgViewer::Viewer::ThreadPerContext);
viewer.run();
_pViewer = NULL;
}
void cancelViewer(){
if( _pViewer != NULL )
_pViewer->setDone( true );
}
private:
osg::Node* _scene;
osgViewer::Viewer* _pViewer;
};
int main(int argc, wchar_t* argv[])
{
std::vector<viewerThread*> garbage;
osg::ref_ptr<osg::Node> n = osgDB::readNodeFile("cow.osg");
if( !n ) return -1;
bool bRun = true;
do{
std::wstring wsCommand;
std::wcout << L"Enter Command : ";
std::getline( std::wcin, wsCommand, L'\n' );
if( wsCommand == L"quit" ){
bRun = false;
}else if ( wsCommand == L"view" ){
viewerThread* vThread = new viewerThread( n.get() );
garbage.push_back( vThread );
vThread->startThread();
}
}while( bRun );
for( unsigned int i = 0; i < garbage.size(); i++ ){
viewerThread* p = garbage.at( i );
p->cancelViewer();
p->cancel();
while ( p->isRunning() )
{
OpenThreads::Thread::microSleep(50);
}
delete p;
}
garbage.clear();
return 1;
}
Regards,
David Johansson
On Thu, Aug 14, 2008 at 10:14 AM, Robert Osfield
<[EMAIL PROTECTED]> wrote:
Hi David,
I really don't know what is up with your usage, there really isn't
enough info about how you set up things to know where things are going
astray.
A window being black suggest to be that rendering itself hasn't
started yet, just that the window has been realized. The osgViewer
doesn't support multiple viewers sharing a single GraphicsContext
(this is what you should use osgViewer::CompositeViewer for so you can
have multiple views sharing a single context).
Robert.
On Wed, Aug 13, 2008 at 7:09 PM, David Johansson <[EMAIL PROTECTED]> wrote:
Hi Everyone,
I have a problem with threading and osg::Viewer.
Basically i create and recreate a bunch of threads that runs a new
Viewer instance and the problem is that the viewers 'draw area' turns
up black if i ever close a Viewer.
Thread1 creates Window1 - viewing Node1 - OK.
Thread2 creates Window2 - viewing Node1 - Ok.
User closes Window1
Thread1 dies.
Thread3 creates Window3 - viewing Node1 -- Will turn up black
Thread4 creates Window4 - viewing Node1 -- All Ok..
Thread5 creates Window5 - viewing Node1 -- Also Ok
User closes window 2
Thread2 dies.
Thread6 creates Window6 - viewing Node1 -- Will turn up black
Thread7 creates Window7 - viewing Node1 -- Ok again.
User closes all windows
Thread3 - 7 dies.
Thread8 creates Window8 - viewing Node1 -- Black.
Thread9 creates Window9 - viewing Node1 -- Black.
Thread10 creates Window10 - viewing Node1 -- Black.
Thread11 creates Window11 - viewing Node1 -- Black.
Thread12 creates Window12 - viewing Node1 -- Black.
Thread13 creates Window13 - viewing Node1 -- Ok!
I noticed that After closing all windows, i had 5 windows running that
acctually showed something(5 new Contexts??). After that i had to
create 5 threads (that were black) until getting a new view that
wasn't black.
Looking through the code my guess is that "graphicsContexts" are
getting reused, however not reset or something like that.
This is the code i use to set-up my viewers:
osgViewer::Viewer viewer;
viewer.addEventHandler(new osgViewer::StatsHandler());
viewer.addEventHandler(new osgViewer::ThreadingHandler());
viewer.addEventHandler(new osgViewer::WindowSizeHandler());
viewer.setSceneData(g);
viewer.setThreadingModel(osgViewer::Viewer::ThreadPerContext); /**/
viewer.run();
Any help would be great!
Regards,
David Johansson
_______________________________________________
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
_______________________________________________
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