From Wang Rui, "I've encountered a strange problem that osgviewerMFC doesn't work well

with the StatsHandler. When the 's' key is pressed, the rendering
window will be halted. I tried solving the problem by commenting a
line in CMFC_OSG_MDIView::OnKeyDown() and it seems to work now.

Another improvement here is to use a thread class derived from
OpenThreads to replace the old _beginthread(). It helps a lot in
keeping a high frame rate when you open more than one MDI child
windows. And the application using OpenThreads in my opinion will be
more compatible and portable."
This commit is contained in:
Robert Osfield 2011-09-12 10:47:59 +00:00
parent c8de3b70ca
commit 5162fcc108
4 changed files with 53 additions and 6 deletions

View File

@ -52,6 +52,7 @@ void cOSG::InitSceneGraph(void)
// Load the Model from the model name // Load the Model from the model name
mModel = osgDB::readNodeFile(m_ModelName); mModel = osgDB::readNodeFile(m_ModelName);
if (!mModel) return;
// Optimize the model // Optimize the model
osgUtil::Optimizer optimizer; osgUtil::Optimizer optimizer;
@ -141,7 +142,7 @@ void cOSG::PostFrameUpdate()
// Due any postframe updates in this routine // Due any postframe updates in this routine
} }
void cOSG::Render(void* ptr) /*void cOSG::Render(void* ptr)
{ {
cOSG* osg = (cOSG*)ptr; cOSG* osg = (cOSG*)ptr;
@ -166,4 +167,33 @@ void cOSG::Render(void* ptr)
AfxMessageBox("Exit Rendering Thread"); AfxMessageBox("Exit Rendering Thread");
_endthread(); _endthread();
}*/
CRenderingThread::CRenderingThread( cOSG* ptr )
: OpenThreads::Thread(), _ptr(ptr), _done(false)
{
}
CRenderingThread::~CRenderingThread()
{
_done = true;
while( isRunning() )
OpenThreads::Thread::YieldCurrentThread();
}
void CRenderingThread::run()
{
if ( !_ptr )
{
_done = true;
return;
}
osgViewer::Viewer* viewer = _ptr->getViewer();
do
{
_ptr->PreFrameUpdate();
viewer->frame();
_ptr->PostFrameUpdate();
} while ( !testCancel() && !viewer->done() && !_done );
} }

View File

@ -27,7 +27,7 @@ public:
void PostFrameUpdate(void); void PostFrameUpdate(void);
void Done(bool value) { mDone = value; } void Done(bool value) { mDone = value; }
bool Done(void) { return mDone; } bool Done(void) { return mDone; }
static void Render(void* ptr); //static void Render(void* ptr);
osgViewer::Viewer* getViewer() { return mViewer; } osgViewer::Viewer* getViewer() { return mViewer; }
@ -41,3 +41,16 @@ private:
osg::ref_ptr<osgGA::TrackballManipulator> trackball; osg::ref_ptr<osgGA::TrackballManipulator> trackball;
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator; osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator;
}; };
class CRenderingThread : public OpenThreads::Thread
{
public:
CRenderingThread( cOSG* ptr );
virtual ~CRenderingThread();
virtual void run();
protected:
cOSG* _ptr;
bool _done;
};

View File

@ -75,9 +75,10 @@ int CMFC_OSG_MDIView::OnCreate(LPCREATESTRUCT lpCreateStruct)
void CMFC_OSG_MDIView::OnDestroy() void CMFC_OSG_MDIView::OnDestroy()
{ {
delete mThreadHandle;
if(mOSG != 0) delete mOSG; if(mOSG != 0) delete mOSG;
WaitForSingleObject(mThreadHandle, 1000); //WaitForSingleObject(mThreadHandle, 1000);
CView::OnDestroy(); CView::OnDestroy();
} }
@ -93,13 +94,15 @@ void CMFC_OSG_MDIView::OnInitialUpdate()
mOSG->InitOSG(csFileName.GetString()); mOSG->InitOSG(csFileName.GetString());
// Start the thread to do OSG Rendering // Start the thread to do OSG Rendering
mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG); //mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
mThreadHandle = new CRenderingThread(mOSG);
mThreadHandle->start();
} }
void CMFC_OSG_MDIView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) void CMFC_OSG_MDIView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{ {
// Pass Key Presses into OSG // Pass Key Presses into OSG
mOSG->getViewer()->getEventQueue()->keyPress(nChar); //mOSG->getViewer()->getEventQueue()->keyPress(nChar);
// Close Window on Escape Key // Close Window on Escape Key
if(nChar == VK_ESCAPE) if(nChar == VK_ESCAPE)

View File

@ -34,7 +34,8 @@ public:
protected: protected:
cOSG* mOSG; cOSG* mOSG;
HANDLE mThreadHandle; //HANDLE mThreadHandle;
CRenderingThread* mThreadHandle;
// Generated message map functions // Generated message map functions
protected: protected: