mfc 按下保存对话框的保存按钮时,对话框卡住了

glowd
博客专家认证
2013-04-01 08:46:14
mfc 按下保存对话框的保存按钮时,对话框卡住了,要等一会儿之后才会消失。

当然按下保存按钮之后我还进行了一些耗时的操作,其实我就是想按下保存按钮之后,这个对话框立即消失,然后再去执行程序的其余部分。
首先我想它肯定先发送了一个关闭对话框的消息,然后发送了一个WM_PAINT消息重绘窗口。但是这个重绘消息优先级较低,暂时没有执行。我就直接Invalidate(),UpdateWindow()进行立即重绘也不起作用。
后来我又想可能关闭和重绘操作时异步的,我就在之后sleep()了一下,不过还是不好使。
再后来我就没有办法了。
还请各位大牛指教!
...全文
1167 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
glowd 2013-04-13
  • 打赏
  • 举报
回复
引用 11 楼 kxltsuperr 的回复:
我认为7楼8楼说的是正道,把耗时的工作放到工作者线程中。
这样的话,那就只有重写整个打印过程了。
小小爬虾 2013-04-07
  • 打赏
  • 举报
回复
我认为7楼8楼说的是正道,把耗时的工作放到工作者线程中。
glowd 2013-04-07
  • 打赏
  • 举报
回复
如果还有什么没有说清楚的,请尽管发问。 任何有帮助的言语,我都是感激不尽的!!!
glowd 2013-04-07
  • 打赏
  • 举报
回复
引用 8 楼 VisualEleven 的回复:
把你费时的操作放到线程函数中去做,没事的时候线程等待。当你按下保存对话框上的OK按钮的时候,得到保存文件的路径之后,直接PostThreadMessage通知线程做事情,并将路径传递给线程函数。
我费时的操作就是打印,本来是应该开启一个后台线程来做的,不过原来的代码就是使用mfc自带的打印功能。即是通过CView::onviewprint()方法。它将打印过程分成几个过程,我不知道如何使用异步进行。 1.我尝试过在入口处CView::onviewprint()进行异步操作,不过mfc的处理好像是和界面相关的。所以不成功。 2.我尝试在Doprinting()方法中开启一个UI线程来弹出保存对话框,供用户输入路径。但是它却要等待整个主线程执行完了之后才执行这个线程中的内容。当然不是优先级问题,因为我设定了最高优先级也不行。当然也不是线程类型问题,我使用了后台线程也不行。 还请各位大侠指教,在下感激不尽!!!
Eleven 2013-04-03
  • 打赏
  • 举报
回复
把你费时的操作放到线程函数中去做,没事的时候线程等待。当你按下保存对话框上的OK按钮的时候,得到保存文件的路径之后,直接PostThreadMessage通知线程做事情,并将路径传递给线程函数。
kyotrue 2013-04-03
  • 打赏
  • 举报
回复
因为你是在界面线程中同步处理的,所以无法做到的。除非你开一个工作线程进行耗时的处理,不过要处理同步。
菜牛 2013-04-03
  • 打赏
  • 举报
回复
没代码说啥。
无言猪 2013-04-02
  • 打赏
  • 举报
回复
处理CLOSE消息和你这个耗时操作在同一线程,你这操作不退出窗口也就无法处理
glowd 2013-04-02
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
如果这个操作是你程序的结束,可以先ShowWindow(SW_HIDE)隐藏对话框,等处理程序完了自然退出 如果可以不用同步操作,那么耗时的操作可以启动一个线程后台来处理 如果要同步 那么可以加一个进度条或提示信息,表示你在努力中
其实那个耗时的操作本身就在另外一个线程中。所以在主线程中才要while循环等待那个线程执行完返回结果。这样就造成了上述的结果. 还有如果ShowWindow(SW_HIDE)隐藏对话框,可以实现将窗口隐藏,那它为何不先进行关闭呢。我肯定已经发送了关闭的消息,不然它也不会最后就关闭了
glowd 2013-04-02
  • 打赏
  • 举报
回复
引用 2 楼 wxj198904 的回复:
一但发送了关闭对话框的消息,其他消息就想应不了了。你想实现什么功能啊?
我想实现当我关闭对话框的时候,我记录用户保存的路径。然后再循环等待,直到另一个线程的文件生成出来,然后再将文件复制到刚才保存的路径中
wawLwxj 2013-04-02
  • 打赏
  • 举报
回复
一但发送了关闭对话框的消息,其他消息就想应不了了。你想实现什么功能啊?
zgl7903 2013-04-01
  • 打赏
  • 举报
回复
如果这个操作是你程序的结束,可以先ShowWindow(SW_HIDE)隐藏对话框,等处理程序完了自然退出 如果可以不用同步操作,那么耗时的操作可以启动一个线程后台来处理 如果要同步 那么可以加一个进度条或提示信息,表示你在努力中

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧