我在程序中是一旦缓冲区里面有数据,马上读取数据,并立即显示数据。而我的真实目的是大概1秒读取并显示一次,这样可以编辑框中对数据看的比较清楚。
如何解决啊?
一下是我读取并显示数据的函数,希望指点!!
LONG CMeasureDlg::OnRecvSerialData(WPARAM wParam,LPARAM lParam)
{
CString strOldRecv = L"";
CString strRecv = L"";
//串口接收到的BUF
CHAR *pBuf = (CHAR*)wParam;
//串口接收到的BUF长度
DWORD dwBufLen = lParam;

//接收框
CEdit *pEdtRecvMsg = (CEdit*)GetDlgItem(IDC_EDT_RECV);
ASSERT(pEdtRecvMsg != NULL); //得到接收框中的历史文本
//pEdtRecvMsg->GetWindowTextW(strOldRecv);

strRecv = CString(pBuf);
//将新接收到的文本添加到接收框中
//strOldRecv = strOldRecv +L"\r\n"+ strRecv;
//strOldRecv = strRecv;
pEdtRecvMsg->SetWindowTextW(strRecv); ////////////////////////////////////
char * buf  =NULL;  //定义发送缓冲区 buf = new char[strOldRecv.GetLength()*2+1];
ZeroMemory(buf,strOldRecv.GetLength()*2+1);

WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,strOldRecv.GetBuffer(strOldRecv.GetLength())
   ,strOldRecv.GetLength(),buf,strOldRecv.GetLength()*2,NULL,NULL); char* stopstring;
char* string=NULL;
string=buf;

double x;
x= strtod(string, &stopstring ); //释放内存
delete[] pBuf;
pBuf = NULL;
delete[] buf;
buf = NULL;
return 0;
}

解决方案 »

  1.   

    将接收数据和显示数据分开,接收到了数据放在缓存里,使用OnTimer读取缓存并刷新数据,刷新时间由你定
      

  2.   

    可以换个方法, 你不用SetWindowText去更新 内容。 而是关联个变量, 比如CString类型的。 
    只管赋值, 然后开个OnTimer,SetTimer(); 在里面UpdataData(FALSE);
      

  3.   


    在OnRecvSerialData添加OnTimer,SetTimer()后,函数无法进入OnTimer呀
      

  4.   

    晕,你干嘛要在OnRecvSerialData添加SetTimer,在需要启动刷新的地方添加就可以了,
      

  5.   

    2 thread, LONG CMeasureDlg::OnRecvSerialData(WPARAM wParam,LPARAM lParam)
    {
      AfxBeginThread(YourThread, this);
       SetTimer();
    }CMeasureDlg::OnTimer()
    {
      UpdateData(FALSE);
    }write YourThread, receive your data in this function, and save it to this->YourString
      

  6.   

    OnTimer是消息函数
    你连接消息映射了么