关于SendMessage和PostMessage的使用感悟

            解决程序假死问题,心情大好,故作此文纪念。

        在之前关于SampleGrabber的使用文章中用到了SendMessage函数。由于使用Grabber时,会新开一个线程,所以需要与主线程进行通信。我之前在回调函数BufferCB中使用的是SendMessage这个函数。但是在程序运行时,会出现程序经常性假死的情况。最开始,我猜想是由于共享内存等问题引起的死锁。所以想要通过对共享内存的保护来避免假死,结果一点用都没有。最后通过日志Log的方法检查错误。最后发现每次假死都是在SendMessage函数之处。通过查询MSDN,发现了SendMessage是这样解释的:“Sends a message to the window and does not return until the window procedure has processed the message”。这就是说,Grabber线程在使用SendMessage函数发送的消息之后,会等待,直到窗口程序对消息做出处理之后才返回。如果窗口程序不处理呢?对,就假死了!

        我们再来看看另外一个函数:PostMessage。一样,看MSDN上的解释:“The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message”。也就是说,和SendMessage实现的功能是一样的,但是这函数不用等待窗口程序处理消息。这样一来就不会引起假死现象了。

        其实MSDN也有说明ISampleGrabber的使用的注意事项:“Therefore, the callback should not perform any actions with the potential to block, such as holding a critical section or waiting on another thread.

        所以,我们只需要将之前的SendMessage改为PostMessage就行了,参数保持不变。


//END ICTwangbiao

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值