GetMessage PeekMessage

最近在忙活进程通讯的东西,其中在A进程中有个通讯线程ATHREAD,B进程中有通讯线程Bthread,研究了半天这个THREAD该怎么写,研究结果如下。

1、线程中创建一个窗口。这个窗口的消息循环需要在线程中,

2、处理线程的消息循环代码如下

    while (PeekMessage(message,0,0,0,PM_REMOVE)) do   //这里如果没有消息就继续
    begin
            TransleteMessage(Message);
            DispatchMessage(Message);
    end
    //这里就是我么说的ONIDLE事件的处理流程。
    WaitMessage;

在上边的代码中我思索了半天查了很多资料了解如下,这里我们如何选择是 使用PEEKMESSAGE,还是使用GETMESSAGE函数。

总结如下,如果你在线程中希望在没有消息的条件下可以去执行其他东西那么我们建议使用PEEKMESSAGE,如果你的处理很单一,就是使用线程循环去处理消息那么我们可以使用GETmessage,因为GETMESSAGE是阻塞式的。
而PEEKMESSAGE是非阻塞式的。

那么上边的代码我们可以修改成

  while not terminated do
    begin
       while getMessage(msg,hwnd,0,0) do   //这里如果没有消息就阻塞了。
   begin
       TransleteMessage(Message);
       DispatchMessage(Message);
 
   end;
    end;

 

接着我们总结下:

     GetMessage      与      PeekMessage函数的对比

GetMessage(LPMSG lpMsg,    HWND hWnd,     UINT wMsgFilterMin,     UINT wMsgFilterMax)

PeekMessage(LPMSG lpMsg,    HWND hWnd,     UINT wMsgFilterMin,     UINT wMsgFilterMax,UINT wRemoveMsg)

根据参数可以看出以上2个函数的区别,参数wRemoveMsg的作用是指定消息获取的方式,如果设为PM_NOREMOVE,那么消息将不会从消息队列中被移出,如果设为PM_REMOVE,那么消息将会从消息队列中被移出;

还有区别:

他们如果没有捕获到消息,程序的主线程会被操作系统挂起。当操作系统再次回来照顾此线程时,发现消息队列中仍然没有消息可取,此时两个函数的行为就不同了:

GetMessage : 过门不入,操作系统再次挂起此线程,去照顾别的线程;

PeekMessage: 取回控制权,使程序执行一段时间,等待可能的消息进入消息队列并将其捕获;这时程序进入空闲时间阶段;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值