关于MFC编辑框显示字符的问题

chuanye23 2013-07-31 10:26:44
大家好,我是个菜鸟,刚接触VC不久,最近在调试一个基于VC的测井系统,其中有个问题一直在困惑着小弟,还请大神不吝赐教!我先把现实的界面截上来:

大家可以看到,预想的情况是:当我点击启动按钮时,在“压力采样”和“温度采样”中就会不断的出现采样值显示,其中数据是由USB接口传输的。关于接收部分的代码如下:
void CCalDlg::OnTimer(UINT nIDEvent)
{
//SYSTEMTIME st1,st2;
// GetLocalTime(&st1);
switch(nIDEvent)
{
case 2:
{
DWORD dwBytesWritten=0;
DWORD dwBytesRead=0;
long m_nPAv = 0;
long m_nTAv = 0;
CString str;
BYTE msg[5];
DeviceRead( msg, 5, &dwBytesRead, 1000);
if(msg[1]==(BYTE)0x51)
{
m_nPAv = (long)msg[2] * 256 + (long)msg[3];
str.Format("%d",m_nPAv);
GetDlgItem(IDC_ED_P_AV)->SetWindowText(str);
msg[0] = 0x63;
msg[1] = 0x52;
msg[2] = 0xda;
msg[3] = 0xda;
msg[4] = 0x69;
DeviceWrite( msg, 5, &dwBytesWritten, 1000);
//GPutACOM((BYTE)0x52); //要求下一次传送温度
}
else if(msg[1]==(BYTE)0x52)
{
m_nTAv = (long)msg[1] * 256 + (long)msg[2];
m_nTAv = m_nTAv/4;
str.Format("%d",m_nTAv);
GetDlgItem(IDC_ED_T_AV)->SetWindowText(str);
msg[0] = 0x63;
msg[1] = 0x51;
msg[2] = 0xda;
msg[3] = 0xda;
msg[4] = 0x68;
DeviceWrite( msg, 5, &dwBytesWritten, 1000);
//GPutACOM((BYTE)0x52); //要求下一次传送温度
}
break;
}
default:break;
}
//GetLocalTime(&st2);
//BYTE msg[5];
}

上述代码的主要意思是:(设置了一个2号定时器500ms)当定时器到时便使用DeviceRead函数获得5个字节的数据,根据第二个字节的内容分析是压力采样帧还是温度采样帧并相应显示,最后再使用DeviceWrite函数发送对应的命令帧要求下位机提供采样值。具体的自定义函数我就不细讲了,总之在设置断点调试时每次进入上述定时器响应函数时都可以获得合理的采样值。
但是问题就在于,当全速运行时,编辑框内的数据显示就有问题了,压力采样的数据跳变了三次后就一直为零了,温度采样值则是显示了一个数据后就再也没变过了,这与断点调试的结果大相径庭。然后我再次调试,发现即使在数据查看窗口中获得了合理的数据,但是显示的压力一直为零,温度值也不变。而且还有一个问题是,每次运行编辑框内显示的数据变化过程都是一样的,这根本不符合采样的原理啊!!!
依小弟粗见,这里显示的部分(SetWindowText附近)应该是有问题,具体是什么问题我也不知道啊,在此求助大神看看,有叙述不清楚的地方请尽管问小弟,谢谢了!
(啊!!打字好辛苦啊)
...全文
308 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-07-31
  • 打赏
  • 举报
回复
检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
  • 打赏
  • 举报
回复
读完数据后运行: UpdateData(FALSE); 或者读数据时用SetWindowText(),来设置数据。
lm_whales 2013-07-31
  • 打赏
  • 举报
回复
DeviceWrite( msg, 5, &dwBytesWritten, 1000); DeviceRead( msg, 5, &dwBytesRead, 1000); 这里的1000是等待一秒吧, 你的定义器500 ms 就来一次, 可是一次读写数据,可能会等待1~2秒,这样的话,就会造成定时器的积压和界面的刷新的停顿,全速运行的话,时间一长,界面会死掉的,那就刷新不了。 还是开个线程读写数据为好。 另外MFC对话框中,EDIT 控件,一般用动态数据交换; m_nPAv = (long)msg[2] * 256 + (long)msg[3]; //m_nPAv定义成整型的,IDC_ED_P_AV控件的变量 UpdateData(FALSE) ;//即可; 不太常用GetDlgItem(IDC_ED_P_AV)->SetWindowText(str); 这种方式。
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
读完数据后运行: UpdateData(FALSE); 或者读数据时用SetWindowText(),来设置数据。
汗,是我看得太草了。。。

64,649

社区成员

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

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