消息机制

254 阅读1分钟

两点: 消息队列, 消息循环


消息流程


Windows的消息机制

操作系统->系统消息队列->应用程序消息队列->DispatchMessage->操作系统->窗口过程

由Windows系统从系统消息队列中取出一个消息,根据MSG消息结构确定消息是要被送往那个窗口,然后把取出的消息送往创建窗口的线程的相应队列. 下面的事情就该由线程消息队列操心了,Windows开始忙自己的事情去了。线程看到自己的消息队列中有消息,就从队列中取出来,通过操作系统发送到相应的窗口过程去处理。

  • 消息队列又分为2种

    • 队列消息:
      • 系统消息队列 : Windows维护
      • 线程消息队列 : 每个GUI线程自己进行维护,为避免给non-GUI线程创建消息队列,所有线程产生时并没有消息队列,仅当线程第一次调用GDI函数时系统才给线程创建一个消息队列。
    • 非队列消息: 消息会直接发送到窗口函数处理,而不经过消息队列. 如调用CreateWindow时,会发送一条WM_CREATE消息, UpdateWindow时,会发一条WM_PAINT消息
  • PostMessage与SendMessage区别

    • PostMessage发送的消息是队列消息,它会把消息Post到消息队列中;
    • SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理,等消息被处理后才返回。

    PostMessage与 SendMessage区别

点击按钮消息的流向


Android的消息机制

需要用到3个知识点: `Handler`, `MessageQueue`, `Looper`

Hander&MessageLoop&Looper之间的关系

  • 图中的msg.target就是发送这条msg的handler
  • send和post没有区别,都是调用的send