注册 登录
编程论坛 Windows论坛

Windows 消息优先级 PostMessage Timer消息

秋丿唯 发布于 2018-01-30 14:58, 1475 次点击

    最近看一位大佬几年前的帖子说:“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)是在定时器中触发。
各位大佬有谁知道??求解???感激不尽
0 回复
1