关于MFC编辑框显示字符的问题
大家好,我是个菜鸟,刚接触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];
}
[解决办法]
读完数据后运行:
UpdateData(FALSE);
或者读数据时用SetWindowText(),来设置数据。
[解决办法]
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
[解决办法]
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); 这种方式。