【MFC】PostThreadMessage注意事项

PostThreadMessage是Windows API中用于向线程发送消息的函数,但并非所有线程都有消息队列。线程需要至少调用一次如GetMessage或PeekMessage的函数来创建消息队列。线程间的通信需要注意线程标识的有效性、内存管理以及避免发送同步消息。此外,PostThreadMessage在UI线程的特定情况下可能导致消息丢失。确保正确理解和使用此函数以避免潜在问题。
摘要由CSDN通过智能技术生成

PostThreadMessage是一个Windows API函数。其功能是将一个队列消息放入(寄送)到指定的消息队列里,不等待线程处理消息就返回。

PostThreadMessage的原型是这样的

BOOL PostThreadMessage( DWORD idThread,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

参数

idThread

其消息将被寄送的线程的线程标识符。如果线程没有消息队列,此函数将失败。当线程第一次调用一个Win 32 USER或GDI函数时,系统创建线程的消息队列。要得到更多的信息,参见备注。

Msg

指定将被寄送的消息的类型。

wParam

指定附加的消息特定信息。

IParam

指定附加的消息特定信息。


但是要注意以下问题
1 .PostThreadMessage有时会失败,报1444错误(Invalid thread identifier. )
其实这不一定是线程不存在的原因,也有可能是线程不存在消息队列(message queue)造成的。
事实上,并不是每个thread都有message queue,那如何让thread具有呢?
答案是,至少调用message相关的function一次,比如GetMessage,PeekMessage。

注:

windows线程分为UI线程和工作者线程,UI线程自带消息队列,用于维护界面的更新等操作,而工作者线程默认是没有消息队列的,如果需要,则可以在工作者线程内调用一次PeekMessage或者GetMessage,这样系统就会赋予工作者线程一个消息队列。

2.如果是post动态分配的memory给另外一个thread,要注意内存的正确释放。

3.PostThreadMessage不能够post WM_COPYDATE之类的同步消息,否则会报错

4.最好不要使用PostThreadMessage post message给一个窗口(或者UI线程),使用PostMessage替代。

因为PostThreadMessage消息会导致消息丢失,当UI正在“用户正在对UI主窗口进行一些UI上的操作,比如调整窗口大小等”或者“UI主线程正好有一个模式对话框弹出的情况”。

这里引用MSDN上的说明:

“Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function. Therefore, if the recipient thread is in a modal loop (as used by MessageBox or DialogBox), the messages will be lost.To intercept thread messages while in a modal loop, use a thread-specific hook.”

参考博客:使用PostThreadMessage在Win32线程间传递消息

                多线程:PostThreadMessage 消息可能会丢失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值