MFC ListBox 显示

gold__sun 2014-09-24 05:02:57
MFC菜鸟
今天用MFC的listbox控件,我就想一个单击事件实现每5s添加一条数据

// m_tt 为CListBox
for (int i = 0; i < 10; i++)
{
m_tt.AddString("test");
Sleep(5000);
}


可是跑起来发现,界面上直接卡死了。
想问,难道是等所有的addString结束后,或者这个单击事件结束后,listbox才会显示内容么?

如果想实现这种过几秒显示一条,难道要启用线程么
...全文
256 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gold__sun 2014-10-09
  • 打赏
  • 举报
回复
引用 11 楼 gold__sun 的回复:
[quote=引用 9 楼 keshuichonglx 的回复:] 我建议使用多线程,在界面类中自定义一个消息响应,响应函数负责执行一次AddString。然后你开启的新线程每5秒发送一次自定义消息给主界面,这样比较稳妥,注意不要在线程里直接调用AddString,这样会引发listbox行号的错误
说到行号错误,我用到listview时,出现这么一个问题。
//插入列
	m_list_result.InsertColumn( 0, _T("车牌号码"), LVCFMT_LEFT, 100 );
	m_list_result.InsertColumn( 1, _T("路口ID"), LVCFMT_LEFT, 120 );
	m_list_result.InsertColumn( 2, _T("车道ID"), LVCFMT_LEFT, 100 );
	m_list_result.InsertColumn( 3, _T("经过时间"), LVCFMT_LEFT, 150 );
在for循环里进行循环显示
while(MoveNext() != -1)
	{
		CString vehiclePlate = GetValueStr(VehiclePassInfoType::vehicle_plate);
		m_list_result.InsertItem(row, vehiclePlate);

		CString traSentry = GetValueStr(VehiclePassInfoType::trasentry_id);
		m_list_result.SetItemText(row, 1, traSentry);

		CString lane = GetValueStr(VehiclePassInfoType::lane);
		m_list_result.SetItemText(row, 2, lane);

		CString passtime = GetValueStr(VehiclePassInfoType::pass_time);
		m_list_result.SetItemText(row, 3, passtime);
		
		row++;
	}
单步的时候每条数据每个字段都是有值, 但是到最后显示出来的时候就成了这个样子 同一车牌号码是有多条记录 [/quote] 小人献丑了,listctrl 的插入数据不是那么用的。 int row = m_list_result.InsertItem(0, vehiclePlate);// 这样才对
qq1061006 2014-09-29
  • 打赏
  • 举报
回复
一次添加不多的话 Timer足矣
排山和倒海 2014-09-29
  • 打赏
  • 举报
回复
建议用多线程,timer也是一个线程,何不自己写一个,这样的话,你说的循环显示就可以了 可以通过消息或者之类的进行操作,但是绝对不能在主界面线程下进行sleep,否则一定会卡死的。
gold__sun 2014-09-29
  • 打赏
  • 举报
回复
引用 9 楼 keshuichonglx 的回复:
我建议使用多线程,在界面类中自定义一个消息响应,响应函数负责执行一次AddString。然后你开启的新线程每5秒发送一次自定义消息给主界面,这样比较稳妥,注意不要在线程里直接调用AddString,这样会引发listbox行号的错误


说到行号错误,我用到listview时,出现这么一个问题。
//插入列
m_list_result.InsertColumn( 0, _T("车牌号码"), LVCFMT_LEFT, 100 );
m_list_result.InsertColumn( 1, _T("路口ID"), LVCFMT_LEFT, 120 );
m_list_result.InsertColumn( 2, _T("车道ID"), LVCFMT_LEFT, 100 );
m_list_result.InsertColumn( 3, _T("经过时间"), LVCFMT_LEFT, 150 );

在for循环里进行循环显示
while(MoveNext() != -1)
{
CString vehiclePlate = GetValueStr(VehiclePassInfoType::vehicle_plate);
m_list_result.InsertItem(row, vehiclePlate);

CString traSentry = GetValueStr(VehiclePassInfoType::trasentry_id);
m_list_result.SetItemText(row, 1, traSentry);

CString lane = GetValueStr(VehiclePassInfoType::lane);
m_list_result.SetItemText(row, 2, lane);

CString passtime = GetValueStr(VehiclePassInfoType::pass_time);
m_list_result.SetItemText(row, 3, passtime);

row++;
}

单步的时候每条数据每个字段都是有值,
但是到最后显示出来的时候就成了这个样子


同一车牌号码是有多条记录
边走边瞧 2014-09-26
  • 打赏
  • 举报
回复
引用 3 楼 gold__sun 的回复:
[quote=引用 1 楼 go_and_see 的回复:] 用定时器吧,写Sleep(5000)是会卡死的。给个建议,没有特殊要求,万万不可使用Sleep函数,工作线程也不可以用。
谢谢你的建议,用定时器确实可以实现。 那我还有个问题啊,如果就是个循环,循环体里会进行一定的操作,操作完了之后加一条数据,那他也是跑完整个循环才会显示啊。这我怎么实现让他循环一次就立马显示一条呢?[/quote] 每循环一次,就会显示一条,只不过显示速度太快了。所以,你想要的动态效果需要用其他办法。
keshuichonglx 2014-09-25
  • 打赏
  • 举报
回复
我建议使用多线程,在界面类中自定义一个消息响应,响应函数负责执行一次AddString。然后你开启的新线程每5秒发送一次自定义消息给主界面,这样比较稳妥,注意不要在线程里直接调用AddString,这样会引发listbox行号的错误
keshuichonglx 2014-09-25
  • 打赏
  • 举报
回复
你要是在按钮的消息处理函数里面做这个事情一定会把界面弄死的,要么使用多线程处理,要么设置一个定时器
a2901153 2014-09-25
  • 打赏
  • 举报
回复
方法有很多 定时器做 自定义消息做 多线程做 还有一个是什么peekmessage 这些都能防止程序卡死
gold__sun 2014-09-25
  • 打赏
  • 举报
回复
引用 5 楼 zhoujielunzhimi 的回复:
[quote=引用 3 楼 gold__sun 的回复:] [quote=引用 1 楼 go_and_see 的回复:] 用定时器吧,写Sleep(5000)是会卡死的。给个建议,没有特殊要求,万万不可使用Sleep函数,工作线程也不可以用。
谢谢你的建议,用定时器确实可以实现。 那我还有个问题啊,如果就是个循环,循环体里会进行一定的操作,操作完了之后加一条数据,那他也是跑完整个循环才会显示啊。这我怎么实现让他循环一次就立马显示一条呢?[/quote] 那就开2个定时器。 第一个定时器,5s。5s后开启第2个定时器。 第二个定时器,200ms。每200ms AddString一次。[/quote] 这个。。。。。
sumos 2014-09-25
  • 打赏
  • 举报
回复
引用 3 楼 gold__sun 的回复:
[quote=引用 1 楼 go_and_see 的回复:] 用定时器吧,写Sleep(5000)是会卡死的。给个建议,没有特殊要求,万万不可使用Sleep函数,工作线程也不可以用。
谢谢你的建议,用定时器确实可以实现。 那我还有个问题啊,如果就是个循环,循环体里会进行一定的操作,操作完了之后加一条数据,那他也是跑完整个循环才会显示啊。这我怎么实现让他循环一次就立马显示一条呢?[/quote] 那就开2个定时器。 第一个定时器,5s。5s后开启第2个定时器。 第二个定时器,200ms。每200ms AddString一次。
gold__sun 2014-09-25
  • 打赏
  • 举报
回复
引用 2 楼 starytx 的回复:
用定时器。 映射OnTimer小时处理函数,在里边AddString。在外边SetTimer就可以了
谢谢,定时器确实可以做
gold__sun 2014-09-25
  • 打赏
  • 举报
回复
引用 1 楼 go_and_see 的回复:
用定时器吧,写Sleep(5000)是会卡死的。给个建议,没有特殊要求,万万不可使用Sleep函数,工作线程也不可以用。
谢谢你的建议,用定时器确实可以实现。 那我还有个问题啊,如果就是个循环,循环体里会进行一定的操作,操作完了之后加一条数据,那他也是跑完整个循环才会显示啊。这我怎么实现让他循环一次就立马显示一条呢?
starytx 2014-09-24
  • 打赏
  • 举报
回复
用定时器。 映射OnTimer小时处理函数,在里边AddString。在外边SetTimer就可以了
边走边瞧 2014-09-24
  • 打赏
  • 举报
回复
用定时器吧,写Sleep(5000)是会卡死的。给个建议,没有特殊要求,万万不可使用Sleep函数,工作线程也不可以用。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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