2012-03-06 36 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

相關問題