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”的结果;但是实际上他是等到程序最后跑完了,才一起出整个结果。也就是没有按照我的代码的顺序执行。请问是什么原因,有解决的方法吗?
如下为我的控件属性
这是结果,他是等到程序全部运行完才会出来;在这之前程序是处于卡着的状态,列表框也一直是空的。 展开
如下为我的程序简化示例:
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”的结果;但是实际上他是等到程序最后跑完了,才一起出整个结果。也就是没有按照我的代码的顺序执行。请问是什么原因,有解决的方法吗?
如下为我的控件属性
这是结果,他是等到程序全部运行完才会出来;在这之前程序是处于卡着的状态,列表框也一直是空的。 展开
1个回答
展开全部
这和控件属性无关。
一起显示出来是正确的,这是由消息机制和线程机制决定的,建议你需要对这两个机制深入了解一下,这是windows编程的基础。
简单的说,你的循环语句,没有给消息环留下刷新的时间,所有消息会“堆积”起来,等待循环完成后执行,因此界面会在执行完毕后一起刷新。
循环影响界面刷新的常用解决方案:
线程。从你的程序看,这是最合理的解决办法。将run做成工作者线程,通过消息机制(而不是循环)完整整体逻辑。
定时器。对于较小代价的循环,可以使用,如果你用迭代计时,这个方法不适用。
强制消息空闲(不推荐)。通过在循环语句中,强制增加Idle时间的方法产生额外的空闲时间,让消息环可以完成界面刷新。这种方法在不熟悉windows编程机制的编程者做开发的代码中常见,但并不是合理的解决方法,造成的问题也比较多。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询