如何使用 Ryzen 7 修复 Windows 上 Qt 5.9 线程的处理器关联



我一直在为我的硕士论文开发一个程序,使用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论坛的这个线程中找到了解决方案,所以感谢这个人。

最新更新