问题现场情况
我新建了一个window窗口,在这个窗口我操作了主窗口的QOpenGLWidget,QOpenGLWidget也能够正常响应,绘制结果也符合预期。
当我尝试拖动qt应用的窗口时,就触发了崩溃:
从倾斜的画面中,很明显Qt底层也是使用OpenGL绘制界面的,这个倾斜的问题就是字节对齐的问题表现
0x120E9F12 (nvoglv32.dll)处(位于 editor.exe 中)引发的异常: 0xC0000005: 读取位置 0x23D36000 时发生访问冲突。
nvoglv的全称是nvdia opengl version
的缩写,这个库是操作系统动态库,很明显这个错误来自OpenGL,是不正当的OpenGL操作导致的,我重新检查了相关代码,初步怀疑可能是在Qt的GUI线程里面,操作OpenGL导致的崩溃,于是尝试使用qt的信号和槽,来尝试进行修复:
class UI1{ public: onStart(string v){ emit this->done("反馈给UI2"); }; signals: void done(string v); } class UI2{ signals: void start(string v); void test(){ UI1* ui1 = new UI1(); QObject::connect(ui1, &UI1::done,this,[=](string v){ }); QObject::connect(this, &UI2::start,ui1,&UI1:onStart) emit this->start("触发UI1.onStart"); } }
发现还是崩溃,因为这个崩溃问题之前也遇到过,于是回忆了下之前的的代码,发现可能跟OpenGL Context
有关系:
qOpenglWidget.makeCurrent();
最终还真的就这样子修复了这个崩溃问题,至于makeCurrent详细查看官方文档。
问题2:编译链接异常,无法关闭vs
控制台会报错,提示:
LINK : error : GetThreadContext failed: 31 LINK : fatal error LNK1000: 在 00007FF7D5ED7CB1 出现未知错误;请参考文档中的技术支持选项
此时无法关闭vs,取消编译也无效,只能从任务管理器中结束任务。
这个问题在开发中遇到了2次,导致这个问题的原因暂时也没有找到。