zoukankan      html  css  js  c++  java
  • PostMessage与SendMessage区别 PeekMessgae和GetMessage区别

      PostMessage与SendMessage都是用来发送消息,并且都是经过回调函数的形式来对消息进行处理。但是它们的处理方式是不同的:

    1、PostMessage是异步处理(非阻塞),它是将消息放到消息队列中,由系统来决定什么时候调用;SendMessage是同步处理(阻塞),它必须等待消息处理完成返回之后才能进行下一步动作。因此也可以看出,SendMessage的消息是不经过消息队列的;

    2、函数原型:BOOL PostMessage(WPARAM wp, LPARAM lp)   and  LRESULT SendMessage(WPARAM wp, LPARAM lp)

     PostMessage返回的是消息发送的成功与否;

     SendMessage返回的是消息函数处理之后的返回值;

    3、PreTranslateMessage函数拦截。PreTranslateMessage可以拦截PostMessage发送的消息不能拦截SendMessage发送的消息;

    一点建议:

    1、进程之间发送消息最好使用PostMessage;

    2、如果需要频繁的发送一个消息,最好不要使用PostMessage;

    3、需要频繁的处理一个消息,担心影响用户体验可以使用SendMessageTimeout

    PeekMessage和GetMessage函数的主要区别有:
    1. GetMessage的主要功能是从消息队列中“取出”消息,消息被取出以后,就从消息队列中将其删除;而PeekMessage的主要功能是“窥视”消息,如果有消息,就返回true,否则返回false。也可以使用PeekMessage从消息队列中取出消息,这要用到它的一个参数(UINT wRemoveMsg),如果设置为PM_REMOVE,消息则被取出并从消息队列中删除;如果设置为PM_NOREMOVE,消息就不会从消息队列中取出。
    2. 如果GetMessage从消息队列中取不到消息,则线程就会被操作系统挂起,等到OS重新调度该线程时,两者的性质不同:使用GetMessage线程仍会被挂起,使用PeekMessage线程会得到CPU的控制权,运行一段时间。
    3. GetMessage每次都会等待消息,直到取到消息才返回;而PeekMessage只是查询消息队列,没有消息就立即返回,从返回值判断是否取到了消息。


    我们也可以说,PeekMessage是一个具有线程异步行为的函数,不管消息队列中是否有消息,函数都会立即返回。而GetMessage则是一个具有线程同步行为的函数,如果消息队列中没有消息的话,函数就会一直等待,直到消息队列中至少有一条消息时才返回。


    如果消息队列中没有消息,PeekMessage总是能返回,这就相当于在执行一个循环,如果消息队列一直为空, 它就进入了一个死循环。GetMessage则不可能因为消息队列为空而进入死循环

  • 相关阅读:
    BZOJ 1192 鬼谷子的钱袋
    浅谈双连通分量、强连通分量
    BZOJ 1047 理想的正方形
    浅谈单调队列、单调栈
    django ORM之manytomany跨表
    django DateTimeField和DateField和TimeField
    django 一对多的添加记录create 和save 方法,update 更新和save()方法的区别,查询API的方法
    Python生成随机验证码
    obj.t2c.all-------django自动生成第三张多对多关系表中另一张表信息在前端的显示
    Form组件验证之ajax提交数据并显示错误信息
  • 原文地址:https://www.cnblogs.com/arsblog/p/5102104.html
Copyright © 2011-2022 走看看