VS2010 使用进度条控件的问题,进度条步进的时候任意操作都可能导致程序崩溃

rui0317 2012-12-08 04:55:14
我使用的是 VS2010,工程中需要使用进度条来显示某项工作的进度。

我添加进度条的方式是在工具箱中选择 "Progress Control",然后放在对话框的某个位置。代码中是用建立新线程的方式来显示进度条状态。用这样的方式 CProgressCtrl m_MainProgressCtl 来调用进度条。

然后在程序运行的时候,到进度条显示的地方,进度条会随机死掉(主代码还在运行),等工作代码执行完毕以后,冻僵的进度条界面正常消失,退回主对话框。有时候甚至会导致整个程序出错死掉。

调试了很多次,但是只要使用了进度条,不管是新建线程,或者就是在主界面直接调用,进度条的界面都会随机冻结,甚至危及主程序。

后来我就做了这个进度条的实验。新建一个 VS2010 的对话框工程,什么也不干,就在界面上放一个进度条控件,然后再放一个按钮来执行驱动进度条的动作

CProgressCtrl m_MainProgressCtl;
....
m_MainProgressCtl.SetRange(0,10000);
....
void CProgressDlg::OnBnClickedMainbutton() //按钮的动作
{
int i = 0;
for(i=0;i<10000;i++)
{
m_MainProgressCtl.SetPos(i);
Sleep(10);
}
}

执行过程中,只要不做任何操作,进度条都能走到底。但是,只要做了其他的操作,比如在对话框随便一个地方点一下,或者在对话框外随便什么地方点一下,对话框就会闪一下,然后鼠标变成忙碌状态(在对话框范围内),进度条也不走了。再次点一下对话框,就出现“程序未响应”的标准 WINDOWS 程序错误界面。

这到底是怎么回事?啥都不干,只用一个进度条控件都会出错?使用这个控件还有什么特殊的要求吗?

实在是郁闷,是不是还有别的实现进度条的方式啊?




...全文
1271 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
傻X 2012-12-09
  • 打赏
  • 举报
回复
我是建议UI归UI,工作线程只能发消息通知UI去改变。 否则就会崩溃。
rui0317 2012-12-09
  • 打赏
  • 举报
回复
感谢 Kyokof 和版主大人的回复,我想我明白你们的意思了。UI 线程与工作线程应该分离开,分别处理,否则不符合图形界面的编程规范,容易产生问题。界面与工作代码之间应该使用消息机制来进行沟通。 其实工作代码是一直在用的硬件芯片处理程序,原本是基于命令行格式的,用的是 C 和汇编。现在要加上图形界面,我在 C++ 和图形界面编程上是新手,遇到的都是这样的基础问题。 很感谢两位朋友的帮助!
rui0317 2012-12-08
  • 打赏
  • 举报
回复
非常感谢楼上朋友的回复!您说的方法,等下我试一下。 我在 VC6 上做了尝试,同样是建立一个对话框,添加进度条控件,然后添加一个按钮,按钮响应代码: //前面做了 m_MainProgressCtl.SetRange(0,10000); void CVc6progressDlg::OnButton1() { int i = 0; int h = 0; int pos = 0; m_MainProgressCtl.GetRange(i,h); while(pos<h) { pos = m_MainProgressCtl.GetPos(); m_MainProgressCtl.SetPos(pos+1); } m_MainProgressCtl.SetPos(0); return; } 编译后,点击按钮,进度条运动的时候,无论我怎么砸鼠标键,界面显示都不会有任何问题,把我郁闷的.....
kyokof 2012-12-08
  • 打赏
  • 举报
回复
更新进度条必须要在UI线程中更新,不能通过后台线程直接调用m_MainProgressCtl变量。 类似这个模式比较好,楼主参考下: UINT WorkProc(LPVOID lParam) { ::PostMessage(hDlg, WM_PROGRESS, 0, 进度); } 界面上接收该消息,并且处理进度。 至于你说的那个实验,你在UI线程中跑,这样子会导致界面定死,你只要鼠标什么的一动,界面卡死是正常。如果实在想做实验,你可以再窗口中开个定时器,在OnTimer事件中更新进度。不明白还可以继续问我。
oyljerry 2012-12-08
  • 打赏
  • 举报
回复
引用 2 楼 rui0317 的回复:
非常感谢楼上朋友的回复!您说的方法,等下我试一下。 我在 VC6 上做了尝试,同样是建立一个对话框,添加进度条控件,然后添加一个按钮,按钮响应代码: //前面做了 m_MainProgressCtl.SetRange(0,10000); void CVc6progressDlg::OnButton1() { int i = 0; int h = 0; ……
你这里是在对话框中,也就是UI线程来更新进度,所以没问题 而如果你在其他工作线程中,那么久应该通过发送消息等方式来让UI线程更新进度条控件

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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