//向串口写数据,内容在buf中,长度为bufLen
BOOL CSeries::WritePort(const char *buf, DWORD bufLen)
{
 if(PostThreadMessage(m_dwWriteThreadID,CM_THREADCOMMWRITE,WPARAM(bufLen),LPARAM(psendmsgtrue)))
   {
     return TRUE; 
   } 
   return FALSE;
}
//消息处理
DWORD CSeries::WriteThreadFunc(LPVOID lparam)
{
   CSeries *pSeries = (CSeries *)lparam;
MSG msg;
DWORD dwWritenLen=0;
char * buf=NULL;
while(TRUE)
{
  //如果捕捉到线程消息
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
   if(msg.hwnd!=0)
   {
     TranslateMessage(&msg);
    DispatchMessage(&msg);     continue;
   }
   if(msg.message==CM_THREADCOMMWRITE)
   {
        //向串口写  
   buf=(char *)msg.lParam; 
  
   dwWritenLen=msg.wParam;
               
   WritePort(pSeries->m_hComm,buf,dwWritenLen);
       
   //删除动态分配的内存
//  delete[] buf;应该需要删除数据的吧?不知为何,程序里加上这句就出错    
   }
}        if(WaitForSingleObject(pSeries->m_hWriteCloseEvent,500) == WAIT_OBJECT_0)
     break;
       pSeries->m_hWriteThread=NULL; }
    return 0;
}现在的问题是:
1.delete[] buf,这里释放内存不对吗?为什么不能释放buf呢
2.PostThreadMessage时,buf内容为abcdefg,bufLen为7.可是从消息队列中取出消息后,buf中内容就不对了,而且   dwWritenLen长度只为1。
  被这两个问题困扰很久了,望大家帮帮忙,非常感谢!

解决方案 »

  1.   

    PostThreadMessage 的最后一个参数是 psendmsgtrue ?可以强制转换成 buf=(char *)msg.lParam ?不出错就怪了
      

  2.   

    不好意思,写错了,PostThreadMessage 的最后一个参数是buf,
      前面修改过一次,忘记改过来了,抱歉
      

  3.   

    buf 是 new 出来的吗?WritePort 后有 delete buf 吗?
      

  4.   

    buf是这样使用的:
      char * buf=NULL;
      buf=(char *)msg.lParam; 
     delete[] buf;我觉得buf应该new产生,所以使用char *buf=new char[128];可是不管什么情况下加上delete[] buf就会出错
               
      

  5.   

    另外,在debug版本下,delete[] buf会出错,而Release版本下不会报错
      

  6.   

    这里应该不可以直接buf=(char *)msg.lParam;  
    至少你strcpy一下吧,不然你delete的内容就变成msg.lParam的了
      

  7.   

    buf=(char *)msg.lParam;
    通过这句话
    你的buf就指向了lParam制定的地址
    如果这个地址不是动态分配的
    你这里就不用delete
    否则一定会报错的
    也就是说你这个函数里面不应该有delete buf这条语句
    至于lParam指向的内存应该有调用函数的功能负责处理
    否则这个逻辑就很乱
      

  8.   

    把msg.lParam的字符拷进buf里面,你所说的问题就都解决了楼主还是乱用指针造成的啊
      

  9.   

    那关于 第二个问题呢?为什么向线程投递消息后,消息中参数wparam和lparam的内容都跟投递前不一样了呢
      

  10.   

    起初向串口循环发送字符s,当串口接收到数据后,停止发送s,改发字符串,比如字符串“at+list”.  发送s时是正常的,在串口收到数据后,发送at+list时,PostThreadMessage时的buf为“at+list”,bulLen为8.而在 消息处理时,这两句中buf=(char *)msg.lParam; 
      dwWritenLen=msg.wParam;buf内容为“烫AT+list”,而长度dwWritenLen为1。
    数组中出现'烫',应该是内存的问题,到底怎么回事啊?