[問題] MFC, 大量IO&更新UI, "無回應"現象

作者: sb5471 (sb)   2017-11-26 20:58:34
開發平台(Platform): (Ex: Win10, Linux, ...)
Win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
MFC
問題(Question):
目前寫一個週邊測試程式 (MFC Dialog), 特點是有大量I/O & UI 更新,
程式大致是外頭包一個 N 萬次的 loop, 每個 loop 做:
(1) 寫test pattern 到週邊, 讀回, 比對
(2) 將最新狀態, 即時更新到 UI
以下按照時間序列
<1> 最初, 發現程式起跑後一段時間, UI 就會"中風" 且若點擊其中 UI 項,
則會顯示 "無回應" 提示. 當時以為自己coding 錯誤, debug了很久.
<2> 之後, 發現, 在顯示 "無回應" 提示後, 不去理會, 放著讓程式跑完
每次都能正確執行到結束. 代表非自己 coding 錯誤所造成.
<3> 再接著, Google 到一個 DisableProcessWindowsGhosting() Win API.
套用上去後, UI "中風" 現象已消失, 週邊最新狀態己能即時顯示在 UI.
但現在 UI 無法與使用者互動, 必須傻等所有測試跑完後, UI 才又恢復
能與使用者互動的狀態.
如果中間想中斷測試, 則必須用"工作管理員" 去關 APP.
我的問題:
有沒有方法, 能即時顯示 UI, 且又能保持與使用者互動的解決方式??
餵入的資料(Input):

預期的正確結果(Expected Output):

錯誤結果(Wrong Output):

程式碼(Code):(請善用置底文網頁, 記得排版)

補充說明(Supplement):
作者: galic (嘎利)   2017-11-26 21:03:00
作者: s89227 (Kei)   2017-11-26 21:39:00
不用那麼高頻率的更新UI,人眼分辨不出來
作者: xam (聽說)   2017-11-26 22:15:00
這多唸點書就行了.. 太古老的問題
作者: l8PeakNeymar (十八尖山內馬爾)   2017-11-26 23:01:00
你只叫一個人做事 他當然忙到沒空回報你new一隻thread專門處理雜物 不然只能看UIthread卡死
作者: Bencrie   2017-11-27 00:11:00
總是會有人把運算跟 UI 寫在同一個 mainloop XD
作者: feeya (24 August 升格為鄉民)   2017-11-27 12:25:00
MFC 多執行緒很難看 所以他沒有寫
作者: Sirctal (母豬母豬 夜裡哭哭)   2017-11-27 12:29:00
如果是vs 2013以上的話 用C++11的thread吧
作者: jasonwu23 (jasonwu)   2017-11-27 17:08:00
計算部分開個thread, thread跑一個while loop, 每次算好就sendmessage傳給gui更新即可這樣子每次背景計算時 前面gui還是照樣能動
作者: F04E (Fujitsu)   2017-11-28 10:05:00
std::thread
作者: rodion (r-kan/reminder)   2017-11-30 10:44:00
大量IO可以考慮asynchronous programming 會有比多執行緒更好的system performance

Links booklink

Contact Us: admin [ a t ] ucptt.com