2013-10-13 42 views
0

我有使用winapi的問題,或者無論如何我都在猜測。當我關閉應用程序時,這個過程仍然是一個'鬼魂'。該窗口照常消失,但進程保持阻止我重新編譯..我必須從任務管理器手動殺死它。關閉窗口後進程保持打開狀態

我已經不知道這部分代碼是錯誤的,它有點長,所以這裏的充分代碼的鏈接:http://pastebin.com/TmRiCeR4

我的猜測,雖然,是它可能有一些與此有關循環:

while(1) { 
       if(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) { 
         if(msg.message == WM_QUIT) { 
           break; 
         } 

         TranslateMessage(&msg); 
         DispatchMessage(&msg); 
       } else 
         draw(); 

       Sleep(100); //crappy way of stopping 10000000000000 loops a second 

     } 

我猜它不正確「逃離」的循環,因此不會繼續執行closewindow()函數之後,但我可能是錯的。我部分複製了教程中的代碼,儘管我修改了它,所以我沒有看到教程代碼中出現的問題。這裏是我正在談論的教程(可能已過時?):http://bobobobo.wordpress.com/2008/02/11/opengl-in-a-proper-windows-app-no-glut/

Google也沒有給我答案。有任何想法嗎?

+0

爲什麼你不使用'GetMessage()'和一個計時器?如果你只想繪製10幀,那麼SetTimer()就足夠了。 –

+0

我不'一定要每秒只畫10幀。我只是簡單地把它循環得非常慢,因爲它沒有任何理由使用CPU上的一個核心的100%,所以我只是每秒循環10次,直到它實際工作。 – Arcticcu

+0

http://stackoverflow.com/questions/10658813/infinite-windows-message-loop – jamesdlin

回答

1

您還沒有表現出實際員額的退出消息的代碼,但如果它是一個簡單的PostQuitMessage(0);那麼你的問題是你PeekMessage()電話:

if(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) 

通過提供一個窗口過濾器(hwnd)你是阻止PeekMessage()檢索任何發佈的線程消息(即,不是發送到窗口,而是發送到線程的消息)。由於PostQuitMessage()發佈線程消息,您的循環將永遠不會檢索它,因此永遠不會退出。

您應該更改呼叫以通過NULL獲取第二個參數。

+0

這樣做。謝謝。 – Arcticcu

0

更改它,這樣,而不是一個while(1)

int continue = 1; 

while(continue > 0) 

if(msg.message == WM_QUIT) { 
          continue = 0; 
          break; 
          } 

我也會縮短睡眠。

+0

這沒有做任何不幸的事 – Arcticcu

0

當窗口關閉時,會生成一個WM_CLOSE消息,您通常會在Window類的消息函數中處理該消息。通常的反應是呼叫PostQuitMessage,這將發送一個WM_QUIT消息。在主應用程序循環您測試WM_QUIT和郵件到達時,你做所有必要的停機和中斷循環或致電ExitProcess

如果PeekMessage後有沒有空閒處理的事,而不是睡覺你應該使用GetMessage,它會在內部睡覺,直到下一條消息到達。然而,OpenGL動畫循環有資格作爲空閒處理,所以你不能這樣做。

但是,如果您的繪圖調用每秒迭代一百萬次,則會出現另一個問題:即您的圖形驅動程序中未啓用垂直回掃同步(V-Sync)。 啓用它!

由於我們希望我們的程序是健壯的,即如果它們在禁用V-Sync的其他用戶計算機上運行,​​那麼儘管將迭代次數限制在某個合理數量上也是有意義的。不過,這不應該使用硬件Sleep來完成。相反,你應該測量draw()次迭代之間的時間dT,如果它小於5ms(即200Hz),你應該在平局後增加5 - dT - 1的休眠時間。

+0

exitprocess也沒有工作..我開始認爲它永遠不會'過去'的如果msg.message ==退出的事情。我試圖把一個消息框,而不是一個休息,如果,它永遠不會彈出。也許這只是因爲它會在彈出窗口之前關閉窗口?另外我注意到我發佈的代碼可能不會編譯,不知道爲什麼,因爲我沒有編輯它併爲我編譯。在循環之外有2箇中斷,Showwindow的第二個參數應該是10.沒有線索我甚至做了這個編譯,但是很好。 – Arcticcu

相關問題