MVS子进程进度实时显示

来源:互联网 发布:des算法f函数 编辑:程序博客网 时间:2024/06/08 14:28

在整合MVS整个流程的时候调用的子进程是比较耗时的操作,执行子进程的时候会暂停父进程的执行,多线程的主线程被阻塞,所以MFC的消息循环也会停止,这样updateData得不到及时显示,而是在一个大的模块执行完之后消息循环重新开始时才整个的显示,这当然不是我们所希望的,这个小问题也折磨了好久,解决方案自然是绕过消息队列里的循环直接执行:

UpdateWindow()

 

如果窗口更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT消息来更新指定窗口的客户区。函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。

m_out_control.UpdateWindow();

这样就可以实时的现实进度信息了

 

 

只将窗口显示区域标记为无效以产生WM_PAINT消息,对于某些应用程序来说也许不是完全令人满意的选择。在呼叫InvalidateRect之后,Windows将WM_PAINT消息放入消息队列中,最后由窗口消息处理程序处理它。然而,Windows将WM_PAINT消息当成低优先级消息,如果系统有许多其它的动作正在发生,那么也许会让您等待一会儿工夫。这时,当对话框消失时,将会出现一些空白的「洞」,程序仍然等待更新它的窗口。

如果您希望立即更新无效区域,可以在呼叫InvalidateRect之后呼叫UpdateWindow:

UpdateWindow (hwnd) ;        

如果显示区域的任一部分无效,则UpdateWindow将导致Windows用WM_PAINT消息呼叫窗口消息处理程序(如果整个显示区域有效,则不呼叫窗口消息处理程序)。这一WM_PAINT消息不进入消息队列,直接由Windows呼叫窗口消息处理程序。窗口消息处理程序完成更新后立即退出,Windows将控制传回给程序中UpdateWindow呼叫之后的叙述。

您可能注意到,UpdateWindow与WinMain中用来产生第一个WM_PAINT消息的函数相同。最初建立窗口时,整个显示区域内容变为无效,UpdateWindow指示窗口消息处理程序绘制显示区域。

 

似乎并非如此,窗口还没更新显示就进入了后续计算密集型操作中

原创粉丝点击