[问题] 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