setwindowtext的奇怪问题

wjzxj 2007-08-31 09:46:01
我需要实时的刷新程序界面,以改变界面上的一些数据显示,所以我采用静态文本,然后在定时器里面使用setwindowtext来改变这些静态文本的显示。但是程序在运行几个小时就崩溃了,经排查,是由于在定时器中,频繁的执行setwindowtext引起的。不知道是怎么回事,怎么解决。
...全文
852 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjzxj 2007-08-31
  • 打赏
  • 举报
回复
运行几个小时没有问题,但是4个多小时就出现问题了
wjzxj 2007-08-31
  • 打赏
  • 举报
回复
使用setwindowtext的静态文本,我在OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)中,还修改了他们的背景颜色
knightshenbin 2007-08-31
  • 打赏
  • 举报
回复
楼主的结论应该是错误的,我的程序里面也在ontimer里面用过setwindowtext,但是没有出过错误,而且我的定时器是100ms的,比LZ的要频繁的多。
wjzxj 2007-08-31
  • 打赏
  • 举报
回复
刚开始使用SetWindowText,出现问题,然后采用AfxSetWindowText,正常运行时间长点,但还是出现问题。现在还在拷机中
wjzxj 2007-08-31
  • 打赏
  • 举报
回复
频繁修改标题,是因为我写的是实时程序,我把OnTimer里面的代码贴出来,
if(!m_WsSendFlag)//电度表通讯正常
{
CString s;
//电度表一
if(m_WsP==0)
{
//如果表一通讯中断,发送通讯恢复到信息窗口
if(!m_Ws0Flag)
{
m_Ws0Flag=TRUE;
if(!m_InfoDlgFlag) OnInfoDlg();
::SendMessage(m_InfoDlg->m_hWnd,WM_USER+21,11,0);
}
//遥测良显示到监视器界面
s.Format("%.2f",m_CT1*Ia/100);
AfxSetWindowText(m_1Ia.GetSafeHwnd(),s);
s.Format("%.2f",m_CT1*Ib/100);
AfxSetWindowText(m_1Ib.GetSafeHwnd(),s);
s.Format("%.2f",m_CT1*Ic/100);
AfxSetWindowText(m_1Ic.GetSafeHwnd(),s);
s.Format("%.2f",m_PT1*Ua/100);
AfxSetWindowText(m_1Ua.GetSafeHwnd(),s);
s.Format("%.2f",m_PT1*Ub/100);
AfxSetWindowText(m_1Ub.GetSafeHwnd(),s);
s.Format("%.2f",m_PT1*Uc/100);
AfxSetWindowText(m_1Uc.GetSafeHwnd(),s);

m_p1=m_PT1*m_CT1*P/100;
m_q1=m_PT1*m_CT1*Q/100;
s.Format("%.2f",m_p1);
AfxSetWindowText(m_1P.GetSafeHwnd(),s);
s.Format("%.2f",m_q1);
AfxSetWindowText(m_1Q.GetSafeHwnd(),s);
}
}
skybluehacker 2007-08-31
  • 打赏
  • 举报
回复
1.可能是你的参数有问题,某个情况下超出字符串长度,溢出;
2.尝试改用PostMessage(WM_SETTEXT...)处理,看看是不是比直接SetText或者用SendMessage好;

(题外话,很少人用Timer来修改窗口标题的,频繁修改的需求不大,如果你只是想要快速检测某一变化的,需要显示出来,最好建立自身的消息机制,一旦需要更新,才触发个消息去更改)

以上建议都尝试过,建议粘贴代码,呵呵。
livedeal 2007-08-31
  • 打赏
  • 举报
回复
代码`
wjzxj 2007-08-31
  • 打赏
  • 举报
回复
我在OnTimer里面把setwindowtext屏蔽掉,就没有问题。定时器的时间间隔为500ms。试过很多次了,在网上看到有的朋友说,频繁更新标题,最好用afxsetwindowtext,我采用afxsetwindowtext来改变标题,程序也崩了,但是比使用setwindowtext,正常运行时间要长些
skybluehacker 2007-08-31
  • 打赏
  • 举报
回复
首先疑惑的是你的trouble shooting结论是否正确,你的排查方式是屏蔽改行代码吗?
还有,你的Timer机制的频繁程度是不是相当的厉害,令系统吃不消,如果负荷过大,考虑优化一下,不然效率也不好啊;
很难相信单单的SetWindowText会让程序崩溃,看看是不是跟其他地方的代码什么引起“冲突”,或者直接使用WM_SETTEXT消息方式去SendMessage()看看,

还是看看你的参数是不是出问题了,譬如字符串传入,而字符串某个时候溢出有效长度等。

good luck !
skybluehacker 2007-08-31
  • 打赏
  • 举报
回复
很可能不是setwindowtext自身的问题,如果可以,你最好用调试模式运行几个小时,等出错误,跟进异常的未知,看堆栈的位置callstatk,看看能不能更加详细定位出问题,说不定是浮点运算出现的异常什么的。

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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