我一直在用OpenSceneGraph-3.4.0和QT5.9中的GUI为我的硕士论文开发一个程序(或者是在Visual 2015和2017中)。工作时一切都很好,但现在我家里有了一台新电脑,我试着让它运转起来。
但是,当我为查看器调用frame()方法时,在QtThread.cpp中,特别是在下面的行中,在setProcessorAffinity(unsigned int cpunum)中会出现读取访问冲突:
QtThreadPrivateData* pd = static_cast<QtThreadPrivateData*>(_prvData);以下是完整的功能(QtThread.cpp是OSG的OpenThreads的一部分):
// Description: set processor affinity for the thread
//
// Use: public
//
int Thread::setProcessorAffinity(unsigned int cpunum)
{
QtThreadPrivateData* pd = static_cast<QtThreadPrivateData*>(_prvData);
pd->cpunum = cpunum;
if (!pd->isRunning) return 0;
// FIXME:
// Qt doesn't have a platform-independent thread affinity method at present.
// Does it automatically configure threads on different processors, or we have to do it ourselves?
return -1;
}OSG中的查看器设置为osgViewer::Viewer::SingleThreaded,但如果删除该行,则会在GraphicsWindowQt.cpp(OsgQt的一部分)中出现“无法使QOpenGLContext在另一个线程中流通”的错误,因此这可能是一个死胡同。
编辑用于澄清
我在osgViewer::Viewer对象上调用frame()。在这个函数中,查看器调用realize() (它是viewer类的函数)。在这里,调用setUpThreading()(它是Viewer类的函数)。这反过来在那里调用OpenThreads::SetProcessorAffinityOfCurrentThread(0),执行以下代码:
Thread* thread = Thread::CurrentThread();
if (thread)
return thread->setProcessorAffinity(cpunum);线程(在第一行之后)有一个值0x00000000fdfdfdfd,在我看来这是一个错误。在任何情况下,最后一个电话是我在我原来的问题上张贴的那个。
我甚至不知道从哪里开始修这个。我想,这是与处理器有关的问题。我的处理器是Ryzen 71700(在工作中它是英特尔的i7 3770k),所以这可能会有所帮助。否则,在家里,我使用的是Windows 10,而在工作中使用的是Windows 7。
我会感谢你的帮助。
发布于 2017-08-14 13:51:12
因此,最后,它似乎是OpenThreads的一个问题(因此,OpenSceneGraph部分,我什么也做不了)。当对OpenSceneGraph源代码使用cmake时,有一个选项"BUILD_OPENTHREADS_WITH_QT“需要禁用。
我在在OSG论坛上的这个帖子找到了解决方案,所以多亏了这个家伙。
https://stackoverflow.com/questions/45529960
复制相似问题