Qt 5.1 中带有共享 QGLWidgets 的线程 OpenGL 问题

2024-03-01

我使用两个 QGLWidget。一种用于加载纹理,一种用于渲染,但它不起作用。

我使用了以下解释http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/ http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/

纹理上传线程 由于推送到 GPU 的数据量很大,上传许多(或大型)纹理通常是一项昂贵的操作。同样,这是可能不必要地阻塞主线程的操作之一。在 4.8 中你可以通过创建一对共享的 QGLWidgets 来解决这个问题。其中一个小部件在单独的线程中变为当前状态,但永远不会在屏幕上可见。主线程通知上传线程要上传哪些图像,上传线程只需对每个图像调用bindTexture(),然后在每个图像完成时通知主线程,以便将其绘制到屏幕上。

使用 Qt 4.8 和 MinGW 可以正常工作,但现在我使用 Qt 5.1 和 MSVC。当我想让线程中的小部件成为当前小部件时,出现错误:

无法使 QOpenGLContext 在不同线程中处于当前状态

我了解该错误,但我该如何修复它。当我不将小部件设置为当前状态时,我无法加载纹理(在bindTexture()函数中冻结)。我还想知道,为什么它适用于我的旧 QT 版本。当错误出现时,我可以按“忽略错误”,程序无论如何都会加载纹理。

这是一些示例代码:

加载纹理:

GLContext::GLContext(QWidget *parent, QGLWidget *myDisplayWidget) :
  QGLWidget(parent,myDisplayWidget)
{
}

...

GLContext* myTextureWidget = new GLContext(this,myDisplayWidget);

...

void TextureLoadingThread::run()
{    
    makeCurrent(); //Here is the bug!
    QImage *im = new QImage(filename);
    GLuint textid = myTextureWidget->bindTexture(*im, GL_TEXTURE_2D, GL_RGBA);
}

EDIT:

当我将 myTextureWidget 的上下文移动到它的线程时,它可以工作,但是当 GUI 构建时,我从 API 收到 makeCurrent 错误(堆栈跟踪在 QT5Widgetsd 中的 QLineEdit::setPlaceHolderText 函数中表示)。当我在显示主窗口几秒钟后将 myTextureWidget 移动到线程时,一切正常。但是我怎么知道qt什么时候完成了所有GUI构建的东西呢?我将 GUI 绘制到带有 QGLWidget 视口的 QGraphicsView 上。

myTextureWidget->context()->moveToThread(myTextureLoadingThread);

在启动新线程并调用 makeCurrent() 之前,您必须启动 didCurrent(),例如

void QGLWidget::startRendering()
{
    doneCurrent();
    context()->moveToThread(mTextureLoadingThread);
}

然后打电话

void TextureLoadingThread::run()
{    
    makeCurrent(); //Here is the bug!
    ...
}

这就是我为解决此错误所做的事情。不幸的是,我没有使用线程进行渲染的完美解决方案。

// EDIT

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 5.1 中带有共享 QGLWidgets 的线程 OpenGL 问题 的相关文章

  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 冒号在c中起什么作用?

    我在课堂上得到了这个例子 但我不确定它的作用 我知道冒号添加了一个位字段 但我仍然不确定这个问题 a b gt 0 3 1 运算符称为条件运算符 If b值为 gt 0 价值3被分配给a否则值1被分配给a 以 Kernighan Ritch
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • 以编程方式添加来自 Laravel 包的 CSRF 检查的异常

    问题简而言之 我正在寻找一种方法来删除VerifyCsrfToken来自包内的全局中间件管道without用户必须修改App Http Middleware VerifyCsrfToken 这可能吗 用例 我正在开发一个包 可以轻松地将推送
  • 查询 DynamoDB

    我有一个 DynamoDB 表 其中一个字母数字字符串作为哈希键 例如 d4ed6962 3ec2 4312 a480 96ecbb48c9da 我需要根据表中的另一个字段查询表 因此我需要查询来选择所有键 例如我的字段 x 位于 dat
  • 发生托管异常时“无可用源” - WPF Visual Studio 2010

    由于某种原因 我的 Visual Studio 2010 没有在我自己的代码上加载调试符号 我正在使用默认的 WPF 应用程序解决方案 使用我正在开发的示例 WPF 应用程序 并在调试模式下运行 当我进入调试状态时 我可以单步执行我的代码
  • Spark zipWithIndex 并行实现安全吗?

    如果我有一个文件 并且每行做了一个 RDD zipWithIndex row1 id1001 name address 0 row2 id1001 name address 1 row100000 id1001 name address 1
  • 无法从袜子确定袜子版本

    使用代理连接 HTTP 代理 10 3 100 207 端口 8080 使用python请求模块get函数 出现以下错误 无法从socks 10 3 100 207 8080 确定SOCKS版本 Try export all proxy s
  • 上传大文件到ftp C#

    我正在使用此代码将大文件上传到 ftp 站点 Code using FileStream fs new FileStream FileLoc FileMode Open FileAccess Read string ftpUrl strin
  • 升级到jetty-9.3.3后JSP编译错误

    我有一个在嵌入式 Jetty 7 6 8 jdk 6 上运行的 webapp 应用程序 但由于浏览器上的 Diffie Hellman 错误 我们决定迁移到较新版本的 Jetty 因此 我们迁移到 Jetty 9 3 3 由于Jetty 9
  • Hibernate 问题 java.lang.Boolean 无法使用 JDK 1.7 转换为 java.lang.String

    我面临着 Hibernate 的问题 使用 Hibernate 3 2 6 和 JDK 1 7 0 21 这个问题是由于 JDK 与 Hibernate 版本的兼容性造成的吗 这个问题是随机的 我仍然无法找到重现的步骤 2014 07 14
  • 如何为对象集合生成唯一的哈希值,而与它们的顺序无关[重复]

    这个问题在这里已经有答案了 假设我有课 public class MyClass public string Type get set public int Id get set 我有一个集合类 它只是一个强类型列表 public clas
  • 在Naoqi 2.5中的pepper平板电脑上安装Android应用程序

    我想使用 NaoQi 2 5 在 Pepper 上安装 Android 应用程序 为了实现这一点 尝试使用 AlTabletService 的隐藏方法 installApk 我在android studios中构建了一个APK并将其部署在p
  • 以无边框形式绘制夹具

    所以我有一个无边框表单 我需要调整它的大小 通过单击 4 个边或角中的任何一个 澄清一下 我希望我的表单像 Windows 7 中的默认便签一样无边框 通过使用 Julien Lebosquain 在这篇文章中提供的代码 我已经让它可以工作
  • 无法通过 OleDb 读取大小超过 ~1mb 的 xlsx 文件

    我想使用 sql 批量复制来加载数据 xlsx文件到数据库 但是 当文件大小超过大约 1mb 时 我遇到了问题 当我尝试打开时OleDbConnection我收到一个错误 No error message available result
  • MYSQL存储多张图片

    我有一个网页 用户可以在其中上传带有图像的文章 用户可以随文章上传的图像数量没有限制 MySQL 数据库中的每一行代表许多文章中的一篇 存储所有这些图像的最佳方式是什么 我知道我会使用 BLOBS LONGBLOBS 但如果我无法控制用户上
  • 如何在Python中可视化距离矩阵? [复制]

    这个问题在这里已经有答案了 我有一个距离矩阵 作为 DataFrame 如下所示 我想为其创建一个像第二个图一样的图来可视化距离 Python中是否有任何可用的绘图对象可以可视化距离矩阵 尝试以下任一方法 NetworkX http net
  • Docker 运行不工作,它说需要至少 1 个参数

    我正在学习 docker 并尝试运行现有的映像 第一个命令工作正常 command 1 docker run name static site e AUTHOR Mathi1 d P dockersamples static site 但下
  • 保持 Git 功能分支最新的策略

    我喜欢让我的功能分支与开发保持同步 频繁执行 git merge no ffdevelopment 有什么问题吗 然后最后运行 git flow feature finish feature1 这些功能分支是共享的 这意味着其他人可能正在处
  • 我需要在 MVC Razor 中对属性值进行编码吗?

    在 cshtml 文件中 我将一个字符串分配给一个属性 例如
  • Android 机器人测试与 Teamcity 的接口

    由于之前没有回答这个问题 也许我没有找到 我调查了以下问题 如何使用robotium在Android设备上执行自动化功能测试 并将其报告给TeamCity等持续集成服务器 由于我没有找到该具体问题的任何答案 因此我进行了调查 以下是我的调查
  • 仅在主页上显示块 HTML?

    我尝试修改家庭控制器添加新变量 data header home true 然后我尝试检查一下header twig模板如下 if header home div Home div else div Not Home div endif 当
  • Qt 5.1 中带有共享 QGLWidgets 的线程 OpenGL 问题

    我使用两个 QGLWidget 一种用于加载纹理 一种用于渲染 但它不起作用 我使用了以下解释http blog qt digia com blog 2011 06 03 threaded opengl in 4 8 http blog q