m_list.InsertItem显示不出数据,窗口直接卡死

茶知谷雨 2019-04-18 10:51:01
大四毕设狗一枚,第一次接触MFC,以下是我的代码,求大家帮我看一下
void CMFC_UDPsendDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
sendbuf = 5;
sendto(sock, (char*)&sendbuf, sizeof(sendbuf), 0, (SOCKADDR*)&addrR, len);
CString str = _T("");
for(int n=0;n<10;n++)
{
int recv_exe;
char recv_proexename[256];
memset(recv_proexename, 0, 256);
recv_exe = recvfrom(sock, (char*)&recv_proexename, 256, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%s"), recv_proexename);
m_list.InsertItem(0, str);
int recv = 0;
int recv_cpu;
memset((char*)&recv_cpu, 0, sizeof(recv_cpu));
recv = recvfrom(sock, (char*)&recv_cpu, 20, 0, (SOCKADDR*)&addrR, &len);
float cpu;
cpu = recv_cpu / 100;
str.Format(_T("%.2f%%"), cpu);
m_list.SetItemText(0, 1, str);
DWORD recv_mem;
memset((char*)&recv_mem, 0, sizeof(recv_mem));
recv = recvfrom(sock, (char*)&recv_mem, 10, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%u KB"), recv_mem);
m_list.SetItemText(0, 2, str);
}
}
想用按钮控制服务器这边接收到进程名、CPU和内存,str的值能获取到相应的字符串或数值,但就是显示不出来
LIstControl的属性已经改成report了
...全文
1125 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxia2118 2019-04-20
  • 打赏
  • 举报
回复
你这个程序做好了能发我一份吗 ,我也在学Socket编程
wuxia2118 2019-04-20
  • 打赏
  • 举报
回复
用列表框控件的 AddString方法就可以添加新行了,把它放到循环语句里不就可以了
天外怪魔 2019-04-19
  • 打赏
  • 举报
回复
引用 24 楼 茶知谷雨 的回复:
可是我是想让它们在同一行里,动态的,一闪一闪的显示
void CMFCApplication1Dlg::OnBnClickedButton1()
{
    if (m_list.GetItemCount() == 0) {
        m_list.InsertItem(0, _T("Notepad.exe"));
    }
    m_list.SetItemText(0, 1, _T("99"));
    m_list.SetItemText(0, 2, _T("1.7G"));
}
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
可是我是想让它们在同一行里,动态的,一闪一闪的显示
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
引用 21 楼 天外怪魔 的回复:
[quote=引用 17 楼 茶知谷雨 的回复:]
[quote=引用 16 楼 天外怪魔 的回复:]
[quote=引用 15 楼 茶知谷雨 的回复:]
我用了一下m_list.SetItemText,但是只显示最后一组数据,请问这要怎么解决呢?

m_list.InsertItem(0, _T("Notepad.exe"));
m_list.SetItemText(0, 1, _T("99"));
m_list.SetItemText(0, 2, _T("1.7G"));

[/quote]
我知道要用InsertItem申请行的~不好意思,我没说明白,我是想说接收新一组数据之后,原来的数据就不显示了,直接显示最后那组数据[/quote]
没看明白。你是说,目前只显示一行数据,也就是你最新收到的数据?
[/quote]
不好意思我的语言表达能力真的很废柴(捂脸
就是我要接收十组数据,像让它们在列表的第一行像任务管理器那样动态显示出来
但是我昨天直接用SetItemText刷新数据,但是这样应该是不对的,因为这样只显示第十组数据的值
今天我加了一个定时器,可以接收到十组数据了,但是后面的数据会前面的顶下去,显示出十行来
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
引用 20 楼 tiger波波 的回复:
你这是自发自收,很奇怪啊。
另外你发一次,接收10次,数据够吗?recvfrom收不到足够数据会阻塞吗??或者说你每次recvfrom都成功了吗??

这段代码看起来很简单,一个数据收发一个显示,显示不会导致卡死,还是数据收发的问题,你单步调试下看看每步成功了没有

我们老师给我们建了一个回环网络,这样我们可以用自己的电脑自收自发,用起来比较方便~
每次recvfrom都成功了的
天外怪魔 2019-04-19
  • 打赏
  • 举报
回复
引用 17 楼 茶知谷雨 的回复:
[quote=引用 16 楼 天外怪魔 的回复:] [quote=引用 15 楼 茶知谷雨 的回复:] 我用了一下m_list.SetItemText,但是只显示最后一组数据,请问这要怎么解决呢?
m_list.InsertItem(0, _T("Notepad.exe"));
    m_list.SetItemText(0, 1, _T("99"));
    m_list.SetItemText(0, 2, _T("1.7G"));
[/quote] 我知道要用InsertItem申请行的~不好意思,我没说明白,我是想说接收新一组数据之后,原来的数据就不显示了,直接显示最后那组数据[/quote] 没看明白。你是说,目前只显示一行数据,也就是你最新收到的数据?
tiger波波 2019-04-19
  • 打赏
  • 举报
回复
你这是自发自收,很奇怪啊。 另外你发一次,接收10次,数据够吗?recvfrom收不到足够数据会阻塞吗??或者说你每次recvfrom都成功了吗?? 这段代码看起来很简单,一个数据收发一个显示,显示不会导致卡死,还是数据收发的问题,你单步调试下看看每步成功了没有
burning0sun 2019-04-19
  • 打赏
  • 举报
回复
看上去很厉害的样子
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
引用 31 楼 天外怪魔 的回复:
[quote=引用 30 楼 茶知谷雨 的回复:]
m_nData1已经在头文件里设置为0了

[quote=引用 29 楼 天外怪魔 的回复:]
[quote=引用 28 楼 茶知谷雨 的回复:]
这是定时器里面的代码
void CMFC_UDP_SendDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1:
// 如果m_nData1已经达到10,则销毁ID为1的定时器
if (10 == m_nData1)
{
KillTimer(1);
break;
}
// 刷新编辑框IDC_LIST2的显示
m_list.DeleteItem(0);
memset(recv_proexename, 0, 256);
recv_exe = recvfrom(sock, (char*)&recv_proexename, 256, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%s"), recv_proexename);
m_list.InsertItem(0, str);

memset((char*)&recv_cpu, 0, sizeof(recv_cpu));
recv = recvfrom(sock, (char*)&recv_cpu, 20, 0, (SOCKADDR*)&addrR, &len);
cpu = recv_cpu / 100;
str.Format(_T("%.2f%%"), cpu);
m_list.SetItemText(0, 1, str);

memset((char*)&recv_mem, 0, sizeof(recv_mem));
recv = recvfrom(sock, (char*)&recv_mem, 10, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%u KB"), recv_mem);
m_list.SetItemText(0, 2, str);

++m_nData1;
break;
default:
break;
}
CDialogEx::OnTimer(nIDEvent);
}

按你这个逻辑,DeleteItem前必须要先判断到底有几条记录的,如果数据还没到,m_list记录为0,删除要出错的。[/quote]
可是我之前没加这句的时候也报这个错(捂脸[/quote]
这么搞起来效率太低了,你代码QQ发我吧:10160172。[/quote]
太感谢了!!我已经发到你的qq邮箱里了~
非常感谢~
weixin_40743613 2019-04-19
  • 打赏
  • 举报
回复
挺好啊,非常有用
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
引用 30 楼 茶知谷雨 的回复:
m_nData1已经在头文件里设置为0了

[quote=引用 29 楼 天外怪魔 的回复:]
[quote=引用 28 楼 茶知谷雨 的回复:]
这是定时器里面的代码
void CMFC_UDP_SendDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1:
// 如果m_nData1已经达到10,则销毁ID为1的定时器
if (10 == m_nData1)
{
KillTimer(1);
break;
}
// 刷新编辑框IDC_LIST2的显示
m_list.DeleteItem(0);
memset(recv_proexename, 0, 256);
recv_exe = recvfrom(sock, (char*)&recv_proexename, 256, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%s"), recv_proexename);
m_list.InsertItem(0, str);

memset((char*)&recv_cpu, 0, sizeof(recv_cpu));
recv = recvfrom(sock, (char*)&recv_cpu, 20, 0, (SOCKADDR*)&addrR, &len);
cpu = recv_cpu / 100;
str.Format(_T("%.2f%%"), cpu);
m_list.SetItemText(0, 1, str);

memset((char*)&recv_mem, 0, sizeof(recv_mem));
recv = recvfrom(sock, (char*)&recv_mem, 10, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%u KB"), recv_mem);
m_list.SetItemText(0, 2, str);

++m_nData1;
break;
default:
break;
}
CDialogEx::OnTimer(nIDEvent);
}

按你这个逻辑,DeleteItem前必须要先判断到底有几条记录的,如果数据还没到,m_list记录为0,删除要出错的。[/quote]
可是我之前没加这句的时候也报这个错(捂脸[/quote]
我先结下贴,换个帖子,因为积分不够了
天外怪魔 2019-04-19
  • 打赏
  • 举报
回复
引用 30 楼 茶知谷雨 的回复:
m_nData1已经在头文件里设置为0了 [quote=引用 29 楼 天外怪魔 的回复:] [quote=引用 28 楼 茶知谷雨 的回复:] 这是定时器里面的代码 void CMFC_UDP_SendDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 switch (nIDEvent) { case 1: // 如果m_nData1已经达到10,则销毁ID为1的定时器 if (10 == m_nData1) { KillTimer(1); break; } // 刷新编辑框IDC_LIST2的显示 m_list.DeleteItem(0); memset(recv_proexename, 0, 256); recv_exe = recvfrom(sock, (char*)&recv_proexename, 256, 0, (SOCKADDR*)&addrR, &len); str.Format(_T("%s"), recv_proexename); m_list.InsertItem(0, str); memset((char*)&recv_cpu, 0, sizeof(recv_cpu)); recv = recvfrom(sock, (char*)&recv_cpu, 20, 0, (SOCKADDR*)&addrR, &len); cpu = recv_cpu / 100; str.Format(_T("%.2f%%"), cpu); m_list.SetItemText(0, 1, str); memset((char*)&recv_mem, 0, sizeof(recv_mem)); recv = recvfrom(sock, (char*)&recv_mem, 10, 0, (SOCKADDR*)&addrR, &len); str.Format(_T("%u KB"), recv_mem); m_list.SetItemText(0, 2, str); ++m_nData1; break; default: break; } CDialogEx::OnTimer(nIDEvent); }
按你这个逻辑,DeleteItem前必须要先判断到底有几条记录的,如果数据还没到,m_list记录为0,删除要出错的。[/quote] 可是我之前没加这句的时候也报这个错(捂脸[/quote] 这么搞起来效率太低了,你代码QQ发我吧:10160172。
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
m_nData1已经在头文件里设置为0了

引用 29 楼 天外怪魔 的回复:
[quote=引用 28 楼 茶知谷雨 的回复:]
这是定时器里面的代码
void CMFC_UDP_SendDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1:
// 如果m_nData1已经达到10,则销毁ID为1的定时器
if (10 == m_nData1)
{
KillTimer(1);
break;
}
// 刷新编辑框IDC_LIST2的显示
m_list.DeleteItem(0);
memset(recv_proexename, 0, 256);
recv_exe = recvfrom(sock, (char*)&recv_proexename, 256, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%s"), recv_proexename);
m_list.InsertItem(0, str);

memset((char*)&recv_cpu, 0, sizeof(recv_cpu));
recv = recvfrom(sock, (char*)&recv_cpu, 20, 0, (SOCKADDR*)&addrR, &len);
cpu = recv_cpu / 100;
str.Format(_T("%.2f%%"), cpu);
m_list.SetItemText(0, 1, str);

memset((char*)&recv_mem, 0, sizeof(recv_mem));
recv = recvfrom(sock, (char*)&recv_mem, 10, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%u KB"), recv_mem);
m_list.SetItemText(0, 2, str);

++m_nData1;
break;
default:
break;
}
CDialogEx::OnTimer(nIDEvent);
}

按你这个逻辑,DeleteItem前必须要先判断到底有几条记录的,如果数据还没到,m_list记录为0,删除要出错的。[/quote]
可是我之前没加这句的时候也报这个错(捂脸
天外怪魔 2019-04-19
  • 打赏
  • 举报
回复
引用 28 楼 茶知谷雨 的回复:
这是定时器里面的代码 void CMFC_UDP_SendDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 switch (nIDEvent) { case 1: // 如果m_nData1已经达到10,则销毁ID为1的定时器 if (10 == m_nData1) { KillTimer(1); break; } // 刷新编辑框IDC_LIST2的显示 m_list.DeleteItem(0); memset(recv_proexename, 0, 256); recv_exe = recvfrom(sock, (char*)&recv_proexename, 256, 0, (SOCKADDR*)&addrR, &len); str.Format(_T("%s"), recv_proexename); m_list.InsertItem(0, str); memset((char*)&recv_cpu, 0, sizeof(recv_cpu)); recv = recvfrom(sock, (char*)&recv_cpu, 20, 0, (SOCKADDR*)&addrR, &len); cpu = recv_cpu / 100; str.Format(_T("%.2f%%"), cpu); m_list.SetItemText(0, 1, str); memset((char*)&recv_mem, 0, sizeof(recv_mem)); recv = recvfrom(sock, (char*)&recv_mem, 10, 0, (SOCKADDR*)&addrR, &len); str.Format(_T("%u KB"), recv_mem); m_list.SetItemText(0, 2, str); ++m_nData1; break; default: break; } CDialogEx::OnTimer(nIDEvent); }
按你这个逻辑,DeleteItem前必须要先判断到底有几条记录的,如果数据还没到,m_list记录为0,删除要出错的。
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
这是定时器里面的代码
void CMFC_UDP_SendDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1:
// 如果m_nData1已经达到10,则销毁ID为1的定时器
if (10 == m_nData1)
{
KillTimer(1);
break;
}
// 刷新编辑框IDC_LIST2的显示
m_list.DeleteItem(0);
memset(recv_proexename, 0, 256);
recv_exe = recvfrom(sock, (char*)&recv_proexename, 256, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%s"), recv_proexename);
m_list.InsertItem(0, str);

memset((char*)&recv_cpu, 0, sizeof(recv_cpu));
recv = recvfrom(sock, (char*)&recv_cpu, 20, 0, (SOCKADDR*)&addrR, &len);
cpu = recv_cpu / 100;
str.Format(_T("%.2f%%"), cpu);
m_list.SetItemText(0, 1, str);

memset((char*)&recv_mem, 0, sizeof(recv_mem));
recv = recvfrom(sock, (char*)&recv_mem, 10, 0, (SOCKADDR*)&addrR, &len);
str.Format(_T("%u KB"), recv_mem);
m_list.SetItemText(0, 2, str);

++m_nData1;
break;
default:
break;
}
CDialogEx::OnTimer(nIDEvent);
}
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
这是按钮控件的代码
void CMFC_UDP_SendDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
sendbuf = 5;
sendto(sock, (char*)&sendbuf, sizeof(sendbuf), 0, (SOCKADDR*)&addrR, len);
// 启动ID为1的定时器,定时时间为1秒
SetTimer(1, 1000, NULL);
}
茶知谷雨 2019-04-19
  • 打赏
  • 举报
回复
谢谢楼上的小姐姐,一直再回复我~
我现在加了定时器,用了删除行的Deleteitem(0),因为我只有一行数据,所以没什么问题
但是现在报了这个错,请问这是什么意思呀?写程序写的要哭了
茶知谷雨 2019-04-18
  • 打赏
  • 举报
回复
引用 3 楼 天外怪魔 的回复:
服务器那里有数据返回吗?


有的,str.Format(_T("%s"), recv_proexename);我用断点查看这句之后str中的值是对的
zgl7903 2019-04-18
  • 打赏
  • 举报
回复
1 DoDataExchange 中 DDX_Control 关联变量 2 recvfrom 是否阻塞了? 这一段最好修改为后台线程处理
加载更多回复(15)

16,470

社区成员

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

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

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