最近看一位大佬几年前的帖子说:“Windows通过QS_SENDMESSAGE、QS_POSTMESSAGE、QS_QUIT、QS_INPUT、QS_PAINT、QS_TIMER表示是否有发送消息、登记消息、退出消息、输入消息、重绘消息、定时消息。消息的优先级是QS_SENDMESSAGE > QS_POSTMESSAGE > QS_QUIT > QS_INPUT > QS_PAINT > QS_TIMER”,通过验证发现鼠标拖动消息QS_INPUT能够屏蔽掉定时器消息,不能屏蔽掉使用PostMessage发送的QS_POSTMESSAGE队列中的消息,与上面所说的吻合。
但是却发现使用PostMessage发送到QS_POSTMESSAGE队列中的消息却不能屏蔽掉定时器消息,这与消息的优先级不吻合。
//测试消息,模拟消息的发送
public static void Test()
{
double start_x = 256;
double start_y = 1138;
//double num = 0;
byte index = 0;
while (true)
{
TagPack tpks = new TagPack();
tpks.Battery = 0x32;
tpks.index = (index++);
tpks.CurBasicNum = 3;
tpks.ID[0] = 0x0A; tpks.ID[1] = 0x0B;
tpks.x = 256;
tpks.y = 1138;
if (start_x > 950 || start_y > 950)
{
start_x -= 20; start_y -= 20;
}
else
{
start_x += 20; start_y += 20;
}
IntPtr record = GetTagPackPtr(tpks, new Point(start_x , start_y ));
tick = Environment.TickCount;
//发送消息的地方
PostMessage(CurHandler, TPPID.WM_TAG_PACK, TPPID.WPARAM_TYPE, record);
//这里最多只能精确到15ms,也就是说这里设置休眠1ms实际上它休眠了15ms
Thread.Sleep(1);
Console.WriteLine("#######p:" + (Environment.TickCount - tick) + " Index:" + tpks.index);
}
}
#######p:0 Index:139
#######p:0 Index:140
#######p:0 Index:141
#######p:0 Index:142
#######p:0 Index:143
#######p:0 Index:144
#######p:0 Index:145
#######p:0 Index:146
#######p:0 Index:147
#######p:0 Index:148
#######p:15 Index:149
#######p:0 Index:150
#######p:0 Index:151
#######p:0 Index:152
#######p:0 Index:153
#######p:0 Index:154
#######p:0 Index:155
#######p:0 Index:156
#######p:0 Index:157
#######p:0 Index:158
#######p:0 Index:159
#######p:0 Index:160
#######p:0 Index:161
#######p:0 Index:162
#######p:0 Index:163
#######p:16 Index:164
#######p:0 Index:165
#######p:0 Index:166
tick1:437
t1:0 index:75
tick1是定时器触发以后才打印。
上面打印的“#######p:0 Index:163”是用PostMessage发送完以后,窗体那边处理后打印“t1:0 index:75”,由打印可知“#####p”标记打印多次但是都没有被处理到,下面打印“t1:0 index:75”说明窗体那边才处理到75包,而PostMessage已经发送到了166包了,说明在窗体的QS_POSTMESSAGE 消息队列中已经堆积了很多消息没有处理完,但是定时器的消息却在后面执行了(tick1:437)是在定时器中触发。
各位大佬有谁知道??求解???感激不尽