VC6.0 MFC 列表框Clistbox中的内容不能随程序一条条显示出来,而是等到程序运行完成才一起出来

我在VC6.0mfc中,用到了一个控件Clistbox,给他创造了一个变量m_list;如下为我的程序简化示例:for(inti=0;i<n;i++){start=clo... 我在VC6.0 mfc中,用到了一个控件Clistbox,给他创造了一个变量m_list;
如下为我的程序简化示例:
for(int i=0;i<n;i++)
{
start = clock();
run(i);//经过一个长时间的运算操作
end=clock();
ts[i]=(double)(end-start)/CLOCKS_PER_SEC;
CString stmp;
stmp.Format("第%d次迭代完成,耗时%lf",i+1,ts[i]);
m_list.AddString(stmp);
}
本来应该是运行一次for循环,就会在CLISTBOX控件上出一个“第x次迭代完成,耗时y”的结果;但是实际上他是等到程序最后跑完了,才一起出整个结果。也就是没有按照我的代码的顺序执行。请问是什么原因,有解决的方法吗?
如下为我的控件属性

这是结果,他是等到程序全部运行完才会出来;在这之前程序是处于卡着的状态,列表框也一直是空的。
展开
 我来答
bhtzu
推荐于2016-03-27 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4043万
展开全部

这和控件属性无关。

一起显示出来是正确的,这是由消息机制和线程机制决定的,建议你需要对这两个机制深入了解一下,这是windows编程的基础。

简单的说,你的循环语句,没有给消息环留下刷新的时间,所有消息会“堆积”起来,等待循环完成后执行,因此界面会在执行完毕后一起刷新。

循环影响界面刷新的常用解决方案:

  1. 线程。从你的程序看,这是最合理的解决办法。将run做成工作者线程,通过消息机制(而不是循环)完整整体逻辑。

  2. 定时器。对于较小代价的循环,可以使用,如果你用迭代计时,这个方法不适用。

  3. 强制消息空闲(不推荐)。通过在循环语句中,强制增加Idle时间的方法产生额外的空闲时间,让消息环可以完成界面刷新。这种方法在不熟悉windows编程机制的编程者做开发的代码中常见,但并不是合理的解决方法,造成的问题也比较多。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式