开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
问题现场情况
我新建了一个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次,导致这个问题的原因暂时也没有找到。