我一直在为我的硕士论文开发一个程序,使用OpenSceneGraph-3.4.0和Qt 5.9的GUI(否则在Visual Studio 2015和2017中(。在工作中一切正常,但现在我家里有一台新电脑,我试图让它运行。
但是,当我为查看器调用 frame(( 方法时,我在setProcessorAffinity(unsigned int cpunum)
QtThread.cpp
中收到读取访问冲突,特别是在以下行中:
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()
(这是查看器基类的函数(。 这反过来又需要OpenThreads::SetProcessorAffinityOfCurrentThread(0)
在其中,执行以下代码:
Thread* thread = Thread::CurrentThread();
if (thread)
return thread->setProcessorAffinity(cpunum);
线程(在第一行之后(有一个值0x00000000fdfdfdfd
对我来说看起来像一个错误。 无论如何,最后一个电话是我在原始问题中发布的电话。
我什至不知道从哪里开始解决这个问题。我假设,这是一些与处理器相关的问题。我的处理器是Ryzen 7 1700(在工作中它是Intel i7 3770k(,所以也许这会有所帮助。 否则,在家里我使用的是Windows 10,而在工作中使用的是Windows 7。
我会感谢任何帮助。
所以最后,这似乎是OpenThreads的问题(因此OpenSceneGraph部分,我对此无能为力(。当对OpenSceneGraph源代码使用cmake时,有一个选项"BUILD_OPENTHREADS_WITH_QT"需要禁用。
我在OSG论坛的这个线程中找到了解决方案,所以感谢这个人。