MFC的sendmessage和postmessage 以及sendmessagetimeout

PostMessage只负责将消息放到消息队列中,不确定何时及是否处理,相当于异步操作,执行后马上返回
SendMessage要等到受到消息处理的返回码(DWord类型)后才继续,相当于同步操作,一直在等待,必须等到消息被处理后才会返回。
SendMessageTimeout 函数,是会有一个超时的操作,防止操作一直没返回,当前程序挂起,这个函数有几个参数:

LRESULT SendMessageTimeout(HWND hwnd,
UINT Msg,
WPARAM wParam,
LPARAM IParam,
UINT fuFlags,
UIUT uTimeout,
LPDWORD lpdwResultult);

  

Msg 为 HWND_BROADCAST,是发给所有的窗口。

   fuFlags;指定如何发送消息。此参数可为下列值的组合:
  SMTO_ABORTIFHUNG:如果接收进程处于“hung”状态,不等待超时周期结束就返回。
  SMTO_BLOCK:阻止调用线程处理其他任何请求,直到函数返回。
  SMTO_NORMAL:调用线程 等待函数返回时,不被阻止处理其他请求。
  SMTO_NOTIMEOUTIFNOTHUNG:Windows 95及更高版本:如果接收线程没被挂起,当超时周期结束时不返回。
  uTimeout:为超时周期指定以毫秒为单位的持续时间。如果该消息是一个广播消息,每个窗口可使用全超时周期。例如,如果指定5秒的超时周期,有3个顶层窗回未能处理消息,可以有最多15秒的延迟。
  IpdwResult:指定消息处理的结果,依赖于所发送的消息。
  返回值:如果 函数调用成功,返回非零值。如果函数调用失败,或超时,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果GetLastError返回零,表明函数超时。如果使用HWND_BROADCAST,SenddMessaggTimeout不提供单个窗口超时信息。

//for example
//发送端:

   WM_CLOSE_AGENT_APP = ::RegisterWindowMessage(_T("CLOSE_AUDIO_DEV_AGENT_APP")); 
   PDWORD_PTR lpdwResultult = 0;
  ::SendMessageTimeout(HWND_BROADCAST, WM_CLOSE_AGENT_APP, 0, 0, SMTO_ABORTIFHUNG, 500, lpdwResultult);

   //接收端:

   //注册同一个窗口消息,然后监听注册的消息

  WM_CLOSE_AGENT_APP = ::RegisterWindowMessage(_T("CLOSE_AUDIO_DEV_AGENT_APP"));  

  ON_REGISTERED_MESSAGE(WM_CLOSE_DEVAGENT_APP, &CILSysAudioDevAgentDlg::OnCloseAgentApp)

 

转载于:https://www.cnblogs.com/132818Creator/p/11466195.html

### 回答1: sendmessagepostmessage都是Windows API中的函数,用于在不同的线程之间发送消息。 sendmessage是同步的,它会等待消息处理完毕后才返回,而postmessage是异步的,它会立即返回,不等待消息处理完毕。 sendmessagepostmessage的参数和返回值都不同,sendmessage的返回值是消息处理函数的返回值,而postmessage的返回值是一个布尔值,表示消息是否成功发送。 在使用这两个函数时需要注意线程安全问题,如果在不同的线程之间发送消息,需要使用线程同步机制来保证数据的正确性。 ### 回答2: 在Windows操作系统中,sendmessagepostmessage是两种常用的消息发送函数。它们都可以通过系统消息队列来发送消息,但实现的机制和使用方式有所不同。 sendmessage函数是一种同步的消息发送方式,它会将消息发送到指定的窗口,并等待窗口处理完这个消息后再返回。sendmessage函数还可以传递一些参数,用于指定不同的事件类型或数据等。sendmessage通常用于与用户交互的操作中,如按钮点击等,因为它会阻塞主线程直到消息处理完毕,这也带来了一定的性能损失。 postmessage函数则是一种异步的消息发送方式,它会立即将消息发送到指定的窗口,但不会等待窗口处理完这个消息。postmessage函数并没有返回值,因此在消息处理完之前,调用者也无法得知该消息是否已被处理。postmessage通常用于耗时的后台操作中,如网络请求或文件读写等,因为它不会阻塞主线程,避免了性能损失。 此外,sendmessagepostmessage还有一些其他的区别。例如,由于sendmessage是同步的,所以它会阻塞线程,直到消息处理完毕;而postmessage是异步的,它不会阻塞线程,而是直接将消息发送到消息队列中等待处理。此外,它们在传递参数的方式上也略有不同,sendmessage通常直接将参数传递给相应的窗口处理函数,而postmessage则会将参数打包为消息结构体中的参数传递。 ### 回答3: SendMessagePostMessage都是Windows API中用于在窗口间发送消息的函数。它们的用途都是向指定的窗口发送一个消息,但发送的方式不同。 SendMessage函数是同步的,也就是在接收到消息之前,它会一直等待直到接收方处理完这个消息。这种方式的好处是发送者可以立即知道接收方是否处理了这个消息,适合在需要获取返回值的情况下使用。 但是,由于SendMessage是同步的,如果接收方长时间无法处理该消息,发送者就会发生阻塞,可能会导致程序崩溃或者卡顿。 PostMessage函数是异步的,发送完消息后就立即返回,不会等待接收方的处理结果。这种方式的优点是不会阻塞程序的运行,同时可以保证消息的可靠传递。因此,如果只需要把消息发送出去,并不需要立即得到它是否被接收方处理,可以考虑使用PostMessage。 总之,SendMessagePostMessage在使用时需要根据实际情况选择。如果接收方需要立即响应这个消息,或者需要同步返回结果,那么应该选择SendMessage函数。如果不关心返回结果,只是需要发出消息,那么可以考虑使用PostMessage
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值