代码之家  ›  专栏  ›  技术社区  ›  Stefan

wglMakeCurrent中的访问冲突

  •  2
  • Stefan  · 技术社区  · 15 年前

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

    wglMakeCurrent(NULL, NULL);
    

    应用程序只有一个线程,在调用之前,我已经检查了当前使用的DC和HGLRC是否正确有效。

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

    另外,这种访问冲突发生在具有不同图形卡的不同机器上,所以我认为这不是驱动程序问题。

    3 回复  |  直到 15 年前
        1
  •  2
  •   gavinb    15 年前

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

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

    继Tarydon建议增加 glFlush ,这似乎是多余的:

    在切换到新的渲染上下文之前,OpenGL将刷新调用线程当前的任何以前的渲染上下文

    考虑到API实际上崩溃了,并且不会简单地导致失败,我能想到的唯一建议是调用的线程 wglMakeCurrent 释放 HGLRC HGLRC

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

    见:

        2
  •  1
  •   Stefan    14 年前

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

        3
  •  0
  •   Tarydon    15 年前