如何解决这个消息处理的问题?

DarkSchneider 2006-07-19 11:40:39
小弟最近试验串口通信,到最后发现程序老是崩溃,跟踪了一下,问题如下,请各位有用BCB处理自定义消息的大人帮忙:

小弟建立了一个监视线程负责监视串口,如果有数据发送过来,发消息到主窗体(Form1),再由相应的函数处理

小弟我在Form1.h里定义了如下的消息映射:
//-----------Form1.h-----------
class TForm1 : public TForm
{
......
protected:
void __fastcall DoMyMsg(TMessage &Message);//处理监视线程消息
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(ON_COM_RECEIVE, TMessage, DoMyMsg);
END_MESSAGE_MAP(TForm)
.......
};


Form1里的处理函数如下:
//----------Form1.cpp--------

..........

void __fastcall TForm1::DoMyMsg(TMessage &message)
{
char ReceiveBuffer[1024];
if(ON_COM_RECEIVE == message.Msg)
if(myComm.Read(ReceiveBuffer, 1024/*BufferLenth*/, 20/*wait time*/))
//上面这行myComm.Read()是我自己写的方法,
//返回的是一个long int,如果读到数据,返回数据长度,否则返回0
Edit1->Text = ReceiveBuffer;
else
Edit1->Text = "Read buffer failed!";
Form1->Dispatch(&message);
}

..................


程序运行时,消息被成功捕获,但是处理函数执行完毕以后,DoMyMsg函数还是会被调用N次(具体的次数不详,大约是会调用无穷多次),跟踪发现上面的消息映射代码也会不停地被执行,请问如何解决这个问题,让消息处理函数只被调用一次?
...全文
146 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
DarkSchneider 2006-07-19
  • 打赏
  • 举报
回复
谢谢 xiaoshi0(小鱼儿),马上试验。

这个是随便写写玩的,所以,主窗体上的代码就胡乱搞了,反正也没多少代码。自己搞的串口类的代码确实需要好好修改一下,谢谢你的建议。

试验成功,马上结帖。
xiaoshi0 2006-07-19
  • 打赏
  • 举报
回复
还有,一般消息都定义成WM_开头的,最好不要用其他的开头,否则容易被误认为是宏定义。
xiaoshi0 2006-07-19
  • 打赏
  • 举报
回复
void __fastcall TForm1::DoMyMsg(TMessage &message)
{
char ReceiveBuffer[1024] = {0};//初始化成员变量是很好的编程习惯
//if(ON_COM_RECEIVE == message.Msg)这句不用,因为收到的肯定是这个消息


//串口通信最好进行关键代码段的保护,否则很可能出现冲突
//用sizeof取一个字符数组的长度是最好的,因为你不知道什么时候会改变该数组的大小,如果像你那样写,就要改很多的地方,如果用sizeof,则只需要改一个地方,其他的地方已经计算好了
if(myComm.Read(ReceiveBuffer, sizeof(ReceiveBuffer), 20))
Edit1->Text = ReceiveBuffer;
else
Edit1->Text = "Read buffer failed!";
//Form1->Dispatch(&message);这句最多余,因为你已经处理过这个消息了,不需要再下发,你那个很可能就是这个搞出来的。
}


注:代码格式严重有问题

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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