2009-12-22 221 views
2

有時候在我的OpenGL應用程序我在下面的API調用得到一個訪問衝突:訪問衝突wglMakeCurrent

wglMakeCurrent(NULL, NULL); 

的應用只有一條單線,我已經檢查了這一呼籲之前,無論是目前使用的DC和HGLRC是正確和有效的。

有三種不同的OpenGL內容窗口,它們都在WM_PAINT消息上重繪,並且由於用戶交互(例如,拾取對象)而需要刷新。

此外,這種訪問違規發生在具有不同顯卡的不同機器上,所以我不認爲這是一個驅動程序問題。

什麼使得這個API調用崩潰?我應該在應用程序代碼中調查哪些內容/爲什麼會發生這種情況?因爲我已經檢查了所有我能想到的東西,所以我真的迷失在這裏。我希望有人能給我提示/想法,還有什麼要檢查。

+0

也許檢查wglMakeCurrent調用或GetLastError的返回值。 – Stringer

+2

wglMakeCurrent崩潰,所以沒有返回值。 – Stefan

回答

1

原來,更新顯卡驅動程序固定的問題。所以這是司機遇到的問題。

0

嘗試在你做這個之前添加一個glFlush調用。也許渲染流水線尚未完全刷新到GPU。

2

這個調用的目的是釋放當前線程的設備上下文嗎?這是兩個參數傳遞NULL唯一有效的時間。從文檔:

「如果hglrc爲NULL,則函數使調用線程的當前渲染環境不再有效,並釋放所使用的渲染上下文關聯設備在這種情況下,HDC被忽略。 「

而且還加入了glFlush的Tarydon的建議,看來這將是多餘的:

「切換到新的渲染環境之前,OpenGL的刷新,這是當前調用線程以往任何渲染上下文「。

鑑於API實際上是崩潰,而不是簡單地導致失敗,我能想到的唯一的建議是,在你呼籲wglMakeCurrent釋放HGLRC線程沒有使用相同的線程上下文將HGLRC與該設備上下文相關聯。因此,驅動程序可能會爲該調用查找錯誤的線程本地存儲,從而導致崩潰。

如果在代碼中添加一些日誌記錄並在每次調用wglMakeCurrent之前打印當前線程ID,會發生什麼情況?

參見:

+0

正如我所提到的,整個應用程序只使用一個線程,所以不同線程的問題是不可能的。 添加日誌記錄代碼也沒有幫助:應用程序真的很討厭我,只是在添加日誌記錄代碼時不會崩潰。我想我必須在這裏深入十年的老代碼:( – Stefan

+0

@Stefan接下來,我會建議將日誌代碼添加到所有'wglMakeCurrent'調用並顯示'DC'和'HGLRC'的值,並返回值,確保調用是一致的,也可以嘗試不同形式的日誌記錄(例如,寫入文件或使用OutputDebugString等)。過去,我發現如果您的應用在添加(或刪除)日誌代碼,這可能是內存損壞的一個症狀,您可能想嘗試一種工具,如BoundsChecker,它可以在運行時檢測錯誤(內存損壞以及API故障等)。 – gavinb