【问题标题】:Windows MessageBox causing bugged OpenGL release to work correctlyWindows MessageBox 导致错误的 OpenGL 版本正常工作
【发布时间】:2012-03-06 22:31:30
【问题描述】:

在 Visual Studio C++ 2010 开发的 OpenGL win32 程序中,调试版无论如何都可以正常工作,只有在我的代码的一定范围内插入 MessageBox() 诊断消息时,发布版才能正常工作。当然这是一个问题,因为现在我无法使用 MessageBox() 调试我的发布版本,这是我通常做的。此外,如果我将 MessageBox() 放在代码的另一部分(在有问题的 Display 循环内),而不是使程序正常工作,它会使光标 spaz 变成沙漏/非沙漏,并且不会显示 MessageBox() ,几乎就像在每个显示帧都调用 MessageBox() 代码但没有做任何正确的事情。

如果 MessageBox() 在某些地方神奇地修复了它,那么了解可能导致错误的原因。

【问题讨论】:

  • 根据 pezcode 对我的回答的注释,如果您可以从设置在需要插入 MessageBox() 的位置的断点发布堆栈跟踪,这将有所帮助,无论是来自调试版本还是发布版本。这将有助于为我们绘制更清晰的画面,而无需您发布大量代码。
  • 如果您需要帮助,请提供更多详细信息。

标签: visual-studio-2010 winapi visual-c++ opengl


【解决方案1】:

MessageBox() 内置了一个 Windows 消息泵循环来服务窗口消息。

在您的应用程序设计中处于非常低级别的某个位置,您需要一个 Windows 消息循环来为托管您的 openGL 内容的窗口提供消息服务。这应该从创建窗口的线程中运行。当从不同的线程调用 MessageBox() 时,您在其他地方看到的不良影响很容易由争用副作用引起。

这里是MSDN上对窗口消息操作的介绍。

Using Messages and Message Queues @ MSDN

简单地说(通过wikipedia 的代码示例),您需要一个类似于以下内容的常设循环:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

根据您处理更新窗口的方式,如果您正在使用绘制消息 (WM_PAINT),您需要确保尽快发送这些消息,或者如果您直接绘制,则可能需要完全禁止它们到设备 DC。我之所以提到这一点,是因为一旦正确设置了消息循环,您可能会发现其他错误。

WM_PAINT message @ MSDN

【讨论】:

  • 知道调试版本有什么不同吗?
  • 在运行调试或发布时不应该有任何明显的差异;我只能根据我们所知道的 MessageBox() 所做的事情来推断,这会导致症状消失。我们还可以推测有一个额外的细节被忽略了,例如调试 ASSERT()s 或其他调试特定的代码,它们也会隐式地导致消息被抽取。我会要求 Op 发布堆栈跟踪;因为这些可能是最有用的信息,可以帮助诊断此问题,而无需深入检查代码。
猜你喜欢
  • 2014-03-11
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2020-01-13
  • 2013-07-02
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多