小编Joh*_*Cox的帖子

Visual Studio 2015:v120 vs v140?

仅供参考:Win10,x64

我今天开始尝试使用Visual Studio 2015,在弄清楚如何运行C/C++部件后,我试图加载一个使用非官方glsdk的大型个人项目.我试图构建并获得链接器错误.它抱怨freeglutD.lib,glloadD.lib和glutil.lib中引用了未解析的外部符号.它还抱怨我自己的文件中的_MSC_VER不匹配.

我在网上做了一些研究,搞乱了2013和编译器版本(项目属性 - >常规 - >平台工具集)) - 2013年的v120和2015的v140 - 并且能够用v140重建glsdk(由于缺少文件而不包括glmesh) ).然后......它工作得很好.

问题:这是为什么?我认为由符合标准的编译器创建的静态lib文件可以与符合标准的编译器的其他版本一起使用(在本例中,v120上的C/C++和v140上的C/C++).但显然v140不会与之前编译器生成的库一起玩.

如果这只是VS构建例程的黑暗之地,那么我可以放弃这个问题,但我也想知道为什么它们不能一起工作.

c++ linker compiler-errors freeglut visual-studio-2015

5
推荐指数
1
解决办法
7368
查看次数

将Qt GUI拆分为GUI,模拟和OpenGL的多个线程是否可行?

我正在试验Qt的工作中的仪器模拟程序的新布局.我们当前的sim在一个窗口中运行所有内容(我们使用过剩(旧)和fltk),它使用glViewport(...)并将glScissor(...)仪器读数分成他们自己的视图,然后它使用某种形式的"ortho2D"调用来创建他们的拥有虚拟像素空间.模拟器当前更新仪器,然后逐个在各自的视口中绘制每个仪器,所有这些都在同一个线程中.

我们想找到一个更好的方法,我们选择了Qt.我在一些很大的限制下工作:

  1. 每个仪表板仍然需要在其OpenGL视口中.有很多按钮和很多乐器.我的初步解决方案是为每个使用QOpenGLWidget.我在这方面取得了进展.
  2. SIM不仅仅是一个非常好的读数,而且还模拟了许多仪器作为仪器设计人员的反馈,因此它有时会有很大的CPU负载.它不是一个完整的硬件模拟器,但它确实模拟了逻辑.我不认为告诉仪器在其关联的小部件paintEvent(...)方法的开头更新自己是可行的,所以我希望模拟更新在单独的线程中运行.
  3. 我们的客户可能拥有旧计算机,因此排除了更新版本的OpenGL.我们仍在使用glBegin()glEnd()之间的所有东西,并且仪器绘制了一堆垃圾变量符号,因此绘图需要花费大量时间,我想将绘图拆分为它自己的线程.我还不知道OpenGL 3是否在桌面上,这对于渲染到屏幕外缓冲区是必要的(我认为).

问题: QOpenGLWidget没有可重写的"更新"方法,它只在窗口小部件paintEvent(...)paintGL(...)调用期间绘制.

暂定解决方案:将模拟器拆分为三个线程:

  1. GUI:运行用户输入paintEvent(...),和paintGL(...).
  2. 模拟器:运行所有仪器逻辑并更新符号系统的值.
  3. 绘图:将最新的符号系统渲染到屏幕外缓冲区(将使用帧缓冲区对象(FBO)).

在这个设计中,跨线程说话是循环的,单向的,GUI线程提供输入,模拟器线程在下一个循环中考虑该输入,绘图线程读取最新的符号系统并将其呈现给FBO并设置"下一帧可用"标志为true(或者可能发出信号),然后该paintGL(...)方法将该FBO并将其吐出到小部件,从而保持事件处理能力下降和GUI响应能力提高.继续这个循环.

底线问题:我在这里读到GUI操作无法在单独的线程中完成,所以我的方法是否可行?

如果可行,任何其他谨慎或建议将不胜感激.

c++ opengl qt multithreading

4
推荐指数
1
解决办法
722
查看次数