wglMakeCurrent中的访问冲突

时间:2009-12-22 20:42:23

标签: windows opengl

有时在我的OpenGL应用程序中,我在以下API调用中遇到访问冲突:

wglMakeCurrent(NULL, NULL);

应用程序只有一个单独的线程,我在检查之前检查过,当前使用的DC和HGLRC都是正确且有效的。

OpenGL内容有三个不同的窗口,它们都在WM_PAINT消息上重新绘制,如果由于用户交互需要刷新(例如,选择一个对象)。

此访问冲突也发生在具有不同图形卡的不同计算机上,因此我认为这不是驱动程序问题。

什么可能导致此API调用崩溃?我应该在应用程序代码中调查一下,找出这种情况发生的原因/原因?我真的迷失了,因为我已经检查了我能想到的一切。我希望有人可以提供更多要检查的提示/想法。

3 个答案:

答案 0 :(得分:2)

此调用的目的是释放当前线程的设备上下文吗?这是两个参数传递NULL的唯一时间是有效的。来自文档:

  

“如果hglrc为NULL,则该函数使调用线程的当前呈现上下文不再是当前的,并释放呈现上下文使用的设备上下文。在这种情况下,将忽略hdc。”

除了Tarydon关于添加glFlush的建议之外,这似乎是多余的:

  

“在切换到新的渲染上下文之前,OpenGL会刷新当前到调用线程的任何先前渲染上下文。”

鉴于API实际崩溃,并且不会简单地导致失败,我能想到的唯一建议是,您调用wglMakeCurrent来释放HGLRC的线程不是用于将HGLRC与该设备上下文相关联的相同线程上下文。因此,驱动程序可能正在为调用查找错误的线程本地存储,从而导致崩溃。

如果您在代码中添加一些日志记录并在每次调用wglMakeCurrent之前打印当前的线程ID,会发生什么?

请参阅:

答案 1 :(得分:1)

原来,更新的图形驱动程序解决了这个问题。所以这是驱动程序中的问题。

答案 2 :(得分:0)

尝试在执行此操作之前添加glFlush调用。也许渲染管道尚未完全刷新到GPU。