2012-03-06 39 views
0

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

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

+1

每pezcode的音符在我的答案,这将有助于如果你需要插入一个'的MessageBox()'你可以张贴从设定在地方断点堆栈跟踪,无论是从调试版本和发布版本。这将有助于为我们绘制更清晰的图像,而无需发布大量代码。 – meklarian 2012-03-07 00:50:32

+0

如果你想得到一些帮助,你应该提供更多的细节。 – Luca 2012-03-09 18:06:50

回答

1

MessageBox()有一个窗口消息泵循环内置到它服务窗口消息。

在您的应用程序中的某个地方,您的设计中的某个层次很低,需要一个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

+2

任何想法调试版本有什么不同? – pezcode 2012-03-07 00:23:30

+1

运行调试或发布时不应该有任何明显的差异;我只能根据我们所知道的'MessageBox()'推断症状消失。我们还可以推测还有一个被忽略的细节,例如调试ASSERT()或其他特定于调试的代码,这些代码也隐含地导致消息被传输。我会要求作业发布堆栈痕迹;因为这些信息可能是最有用的信息,可以帮助诊断,而不需要深入检查代码。 – meklarian 2012-03-07 00:45:27

相关问题