读书人

再问PostMessage?解决方案

发布时间: 2012-03-09 21:42:54 作者: rapoo

再问PostMessage?
我在程序中定义了4个消息
#define WM_MYMSG_ch1 WM_USER+101
#define WM_MYMSG_ch2 WM_USER+102
#define WM_MYMSG_ch3 WM_USER+103
#define WM_MYMSG_ch4 WM_USER+104

重载了消息处理函数:
void __fastcall TFDownload::WndProc(Messages::TMessage &Msg)
{

if(Msg.Msg==WM_MYMSG_ch1)
{
proc1();
}
else if(Msg.Msg==WM_MYMSG_ch2)
{
proc2();
}
else if(Msg.Msg==WM_MYMSG_ch3)
{
proc3();
}
else if(Msg.Msg==WM_MYMSG_ch4)
{
proc4();
}

else
TForm::WndProc(Msg);
}


顺序发送了四个消息:
PostMessage(FDownload->Handle,WM_MYMSG_ch1, 0,0);
PostMessage(FDownload->Handle,WM_MYMSG_ch2, 0,0);
PostMessage(FDownload->Handle,WM_MYMSG_ch3, 0,0);
PostMessage(FDownload->Handle,WM_MYMSG_ch4, 0,0);

请问这4个消息在消息队列中是一个一个按顺序处理还是并行处理?
会不会存在当前消息正在处理就响应下一个消息,即两个消息同时 处理?怎么做才能保证只有当前消息处理完成的才能处理下一个消息?

[解决办法]
想要当前消息处理完成的才能处理下一个消息,请用SendMessage
[解决办法]

探讨
顺序发送了四个消息:
PostMessage(FDownload->Handle,WM_MYMSG_ch1, 0,0);
PostMessage(FDownload->Handle,WM_MYMSG_ch2, 0,0);
PostMessage(FDownload->Handle,WM_MYMSG_ch3, 0,0);
PostMessage(FDownload->Handle,WM_MYMSG_ch4, 0,0);

请问这4个消息在消息队列中是一个一个按顺序处理还是并行处理?
会不会存在当前消息正在处理就响应下一个消息,即两个消息同时 处理?怎么做才能保证只有当前消息处理完成的才能处理下一个消息?

[解决办法]
系统处理消息肯定是按顺序进行分配到具体消息处理过程的的,问题的每个消息处理的时间是不一样的,如果第1个消息比第2个消息处理时间长,那么第2个消息,甚至第3、4个消息就会在第1个消息完成前处理完毕。所以,要保证当前消息处理完成后才能处理下一个消息,只能用SendMessage一个个等待处理
[解决办法]
学习下。
[解决办法]
首先要清楚的是单线程的应用程序肯定在顺序执行的。
如果在处理proc1()的时候没有退出的话,任何其它本进程的函数都不可能被执行到的。

单个CPU的计算机不会有真正的并行的,所以这里不用但心,决对会一个一个的执行的。

[解决办法]
探讨
系统处理消息肯定是按顺序进行分配到具体消息处理过程的的,问题的每个消息处理的时间是不一样的,如果第1个消息比第2个消息处理时间长,那么第2个消息,甚至第3、4个消息就会在第1个消息完成前处理完毕。所以,要保证当前消息处理完成后才能处理下一个消息,只能用SendMessage一个个等待处理

读书人网 >C++ Builder

热点推荐