MFC ecdit数据量很多 显示很导致程序很卡

lxs674390646 2012-07-29 03:20:35
void CMy3Dlg::OnMSComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
char* pdata;
CString strtemp;
CString showtextstr;

if(comIsInit != TRUE)
return;

if(fp == NULL)
{
fp = fopen(m_ShowDefFile,"w");
if(fp == NULL)
return;
}

if(m_a.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_a.GetInput(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArra变量
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
pdata = (char*)malloc(len+1);
showtextstr = "";

for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,pdata+k);//转换为BYTE型数组
BYTE bt=*(char*)(pdata+k); //字符型

strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
showtextstr+=strtemp;//加入接收编辑框对应字符串
}

int len=m_ShowText.GetLineCount();
if(len > 300)
{
m_ShowText.SetSel(0,len-300,TRUE);
m_ShowText.ReplaceSel("");
}

len=m_ShowText.GetWindowTextLength();
m_ShowText.SetSel(len,len);
m_ShowText.ReplaceSel(showtextstr);


fwrite(showtextstr,sizeof(char), strlen(showtextstr), fp);
free(pdata);
}
}

接受数据并Cedit显示的串口程序,当数据量很多以后,很出现程序被卡住。
去掉标红色的部分(不去显示串口的数据),就不是很卡。
注意:串口数据量很大。
...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmcanyu 2012-08-02
  • 打赏
  • 举报
回复
用线程操作MSComm是很纠结的.
创建一个UI线程, 把控件放在UI的窗口上,是否可行呢
lxs674390646 2012-08-02
  • 打赏
  • 举报
回复
用线程来显示,是否需要开辟个空间,来保存获取到的字符串。
试用过定时器的方法来做,不会出现卡死的现象,但是效果不是很理想。
void CMy3Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default

switch(nIDEvent)
{
case TIMER_ONE:
if(strlen(showtextstr)!=0)
{
//MessageBox(showtextstr);
int len=m_ShowText.GetLineCount();
if(len > 300)
{
m_ShowText.SetSel(0,len-300,TRUE);
m_ShowText.ReplaceSel("");
}
len=m_ShowText.GetWindowTextLength();
m_ShowText.SetSel(len,len);
m_ShowText.ReplaceSel(showtextstr);
showtextstr="";
}
break;
}
}

由于小弟create_thread的时候一直编译不通过(里面有的控件)。能否写个线程。谢谢
  • 打赏
  • 举报
回复
数据接收在线程中,显示可以使用CListControl或CListBox
hdg3707 2012-07-29
  • 打赏
  • 举报
回复
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
改成这三句,不能用上面的三句
hdg3707 2012-07-29
  • 打赏
  • 举报
回复
象这种情况只能建立一个线程显示,并在线程里加上三句消息处理函数用来接收其它消息:
MSG msg;
while(GetMessage(&msg,NULL,0,0))//从消息队列中取消息
{
TranslateMessage (&msg); //转换消息
DispatchMessage (&msg); //派发消息
}
lxs674390646 2012-07-29
  • 打赏
  • 举报
回复
求助兄弟们下。

16,472

社区成员

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

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

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