[問題] 請教一下MFC中的多執行緒當機問題

看板C_and_CPP作者 (ㄚ魚!!)時間10年前 (2013/09/16 16:52), 編輯推噓0(003)
留言3則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenGL, MFC 問題(Question): 小弟目前做了一個程式,可以讀入路徑檔算三維物體碰撞 由於希望可以讓使用者即時可以觀視點平移旋轉之類,模型運算是放在Thread上 這邊大致上沒碰到什麼問題 後來又因使用上需要,加入了可以"暫停","停止"的功能 使用上也沒問題,就偏偏某位使用者"在最後一步的瞬間,也按下了停止按鈕" 就出問題了.... (最後一步會跑一些按鈕DISABLE功能) 餵入的資料(Input): 在最後一步按下STOP按鈕 預期的正確結果(Expected Output): 按下STOP停止程序 錯誤結果(Wrong Output): 程式陷入無窮迴圈 程式碼(Code):(請善用置底文網頁, 記得排版) Thread() { while(m_bThreadStop == FALSE) { ModelAnalysis(); //模型計算 if(m_step == LastStep) //如果最後一步 { m_Pause.EnableWindow(FALSE); //各按鈕的DISABLE m_Stop.EnableWindow(FALSE); m_StaticSlider.EnableWindow(FALSE); } } m_pThread = NULL; } /////////////////////////////////////////////////////// 程式主幹 OnStop { m_bThreadStop == TRUE; while(m_pThread !=NULL) { sleep(100); // 防止模型正在跑Thread計算到一半就呼叫原本MODEL,會打架 } ReloadModal(); } 補充說明(Supplement): 照理說 應該是跑到最後一步 if(m_step == LastStep) 會進行一些UI控制 然後讓m_pThread = NULL; OnStop()這邊m_bThreadStop == TRUE 並等待跑完當下最後一次運算 等到 m_pThread == NULL; 就會確保不會和while(m_bThreadStop)中的模型計算起衝突 但是 偏偏有個使用者 在while(m_bThreadStop == FALSE)的那一瞬間 按下STOP按鈕 (能按到我還真佩服 要按在那0.X秒鐘內 我按了好幾次 大概三次才能成功一次吧...) 結果好像thread就停在 m_Pause.EnableWindow(FALSE); //各按鈕的DISABLE m_Stop.EnableWindow(FALSE); m_StaticSlider.EnableWindow(FALSE); 某一行中(好像每次不一定) 跑不出迴圈就沒有 m_pThread = NULL; 自然主幹中程序就一直在while迴圈內一直sleep了....程式就不動了XDDDD 如果把那些按鈕的UI comment掉 就沒有這現象出現..... 個人解讀: 難道不同BUTTON的FUNCTION在太短的時間內也會打架@@???? 不知是否有哪位版友有碰過這種情況的嗎?? 目前是WorkAround的把按鈕的UI寫出去 可是就是覺得很奇怪 想要問個明白 ..... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.117.112.106

09/16 22:43, , 1F
race condition, crtical section, semphore
09/16 22:43, 1F

09/17 10:22, , 2F
UI thread 請不要用 while + Sleep 容易咬死
09/17 10:22, 2F

09/18 08:36, , 3F
感謝指點 我從沒想過MFC元件間會互衝......
09/18 08:36, 3F
文章代碼(AID): #1IDiRCkF (C_and_CPP)