Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)

摘要:
通常,发送的消息是窗口句柄设置为NULL的标准窗口消息。如果将PostThreadMessage放置在已创建窗口的已读消息中,则很可能会显示已发布的消息。这是因为UIthread无法通过主消息循环运行。例如,当显示消息框时,它将在消息框提供的消息循环中运行。次消息循环不知道如何处理线程消息,因此将被阻塞。当您使用PostThreadMessage向创建窗口的线程发送消息时,消息可能会丢失。这是因为UI线程并不总是在第一级消息循环中。例如,当线程显示消息对话框时,它在消息对话框提供的消息循环中运行。在将消息发布到UI线程时,请使用PostMessage()代替,并将消息发布给线程所拥有的窗口。即使线程正在运行第二个消息循环,消息也不会显示在下面。因此,当您想向UI线程发送消息时,请改用PostMessage()并将消息发送到线程自己的窗口。发表于2009年4月2211:37,阅读《龙1》的评论,由编辑收集并引用
Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)
Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads
  不要用Win32 API PostThreadMessage()向UI线程发送消息。
  
  PostThreadMessage is a Win32 API used to post messages to threads. Usually, the message posted is a standard windows message with the window handle set to NULL.
  PostThreadMessage是一个Win32 API常用于向线程发送消息。通常,这个被发送的消息是个窗口句柄被设为NULL的,标准的窗口消息。
  When PostThreadMessage is used to post messages to a thread that has created a window, it is very likely that the posted messages will be lost. This is because UI threads are not always run by the primary message loop. For example, when a thread is showing a message box, it is running on the message loop supplied by the message box. This secondary message loop does not know how to handle the thread message (since its window handle is NULL) and it will be dropped.
  当你将PostThreadMessage用于向一个创建窗口的线程发送消息,结果这个消息很可能会丢失。这是因为UI线程并非总是在一级消息循环中。例如,当一个线程正显示一个消息对话框,它就运行在这个消息对话框提供的(代理的)消息循环中。这个二级消息循环不知如何处理这个线程消息(因为其窗口句柄是NULL)所以它会被放弃。
  So when posting messages to a UI threads, use PostMessage() instead and post messages to a window owned by that thread. Then the messages won’t be lost, even if the thread is running a secondary message loop.
  因此,当要发送一个消息给UI线程,就用PostMessage()作替代并向线程自己的窗口发消息。这样消息就不会被丢失,即便这个消息是运行在二级消息循环中。
发表于 2009-04-22 11:37 大龙1 阅读(21) 评论(0)  编辑 收藏引用
 

免责声明:文章转载自《Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[BZOJ 1568][JSOI2008]Blue Mary开公司《Windows Mobile实例开发》电子书提供下载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

线程同步以及AutoResetEvent

近期在重构老项目时发现有些地方用了AutoResetEvent,于是查了些资料学习整理。 线程同步介绍 即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。 同步就是协同步调,按预定的先后次序进行运行。如...

Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程

线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED。因为服务 B 依赖外部接口,刚开始误以为外部接口延时导致,所以临时增加服务 B dubbo 线程池线程数量。配置变更之后,重启服务,服务恢复正常。一段时间之后,服务 B...

进程之间的通信

进程/线程同步的方式和机制,进程间通信 一、进程/线程间同步机制。 临界区、互斥区、事件、信号量四种方式临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果...

Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)

  对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程。其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件满足时唤醒所有等待线程。   下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下: #inclu...

Java常用类库与技巧

Java异常 异常处理机制主要回答了三个问题 What:异常类型回答了什么被抛出 Where:异常堆栈跟踪回答了在哪抛出 Why:异常信息回答了为什么被抛出 Java的异常体系 ​ Error和Exception的区别 从概念角度解析Java的异常处理机制: 1.Error:程序无法处理的系统处理,编辑器不做检查(如系统崩溃,虚拟机错误,内存空间不足,方法...

【转】编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

建议87:区分WPF和WinForm的线程模型WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button、TextBox等)必须由创建它的那个线程进行更新。WinForm在这方面的限制并不是很严格,所以像下面这样的代码,在WinForm中大部分情况下还能运行(本建议后面会详细解释为什么会出现这种现象): private void but...