`
f002489
  • 浏览: 264915 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

UI线程和Windows消息队列

    博客分类:
  • VC++
 
阅读更多
《Windows核心编程》


UI线程和Windows消息队列

Windows多线程及消息队列

深入理解Windows消息机制

windows消息处理机制

Windows消息机制详解

Windows消息响应机制之二:消息
Windows消息响应机制之三:线程与消息队列
Windows消息响应机制之四:PostQuitMessage和GetMessage函数
Windows消息响应机制之五:MFC消息响应机制分析
  • 大小: 15.4 KB
  • 大小: 20.4 KB
分享到:
评论
1 楼 f002489 2016-12-03  
1. 所谓的worker线程,是指完全不牵扯到图形用户界面(GUI),纯粹做运算的线程。

2. 微软的多线程模型: 
Win32说明文件一再强调线程分为GUI线程和worker线程两种
GUI线程负责建造窗口以及处理主消息循环。Worker负责执行纯粹的运算工作,如重新计算或重新编页等,这些运算工作会导致主线程的消息队列失去反应。一般而言,GUI线程绝不会去做那些不能够马上完成的工作。
GUI线程的定义是:拥有消息队列的线程。任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理。所有对此窗口的改变也都应该由该线程完成。  如果worker线程也产生了一个窗口,那么就会有一个消息队列随之被产生出来并且附着到此线程身上,于是worker线程摇身一变成了GUI线程。这里的意思是:worker线程不能够产生窗口、对话框、消息框,或任何其他与UI有关的东西。 
如果一个worker线程需要输入或输出错误信息,它应该授权给UI线程来做,并且将结果通知给worker线程。 
消息队列是一个链表,只有在必要的时候,才有元素产生出来。具体的关于消息队列的数据结构,可以参考相关的windows文档。

3. 在Win32中,每一个线程有它自己专属的消息队列。这并不意味着每一个窗口有它自己的消息 队列,因为一个线程可以产生许多窗口。如果一个线程停止回应,或是它忙于一段耗时的计算工作,那么由它产生的窗口统统都会停止回应,但系统中的其他窗口还会继续正常工作。 以下是一个非常基本的规则,用来管理Win32中的线程、消息、窗口的互动: 所有传送给某一窗口之消息,将由产生该窗口之线程负责处理。 比方说,使用SetWindowText来更新一个Edit框的内容,其实就是发出了一个WM_SETTEXT消息给edit窗口函数。推而广之,每一个控件都是一个窗口,都拥有自己的窗口函数。 对窗口所作的一切事情基本上都会被该窗口的窗口函数处理,并因此被产生该窗口的线程处理。 当需要发送一个消息时,Windows会自动计算出哪一个线程应该接收到消息(以便确定该消息实体应该挂在在哪一个线程的消息队列中)。同时,windows还会确定线程应该如何被告知有这么一个消息进来。一共有四种可能:  (1)如果属于同一线程,使用SendMessage传递消息,则直接调用窗口函数。  (2)如果属于同一线程,使用PostMessage传递消息,则把消息放在消息队列中然后立即返回。 (3)如果不属于同一线程,使用SendMessage传递消息,则切换到新线程中并调用窗口函数。在该窗口函数结束之前,SendMessage不会返回。  (4)PostMessage立刻返回,消息则被放到另一线程的消息队列中。  当我send一个消息给另一线程掌握的窗口时,系统必须做一次context switch,切换到另一线程去,调用该窗口函数,然后再做一次context switch切换回来,相对一般的函数调用而言,期间的额外负担较大。如果在MDI中,为每个子窗口分配一个线程,那么该子窗口的所有资源——包括画刷,DC,调色板等等都属于线程的资源。此时为线程做context switch时会代价很大。

相关推荐

    细说UI线程和Windows消息队列.doc

    细说UI线程和Windows消息队列

    细说UI线程和Windows消息队列

    本文大致地介绍了UI线程运行机制 消息运行机制

    用队列方式解决非UI线程操作UI,比invoke强大一万倍

    基于接口和队列的线程操作UI方式 在实际开发应用中,非UI线程操作UI是普遍存在的,在.net下一般是通过Control.Invoke的方法来进行操作,但到处都是Control.Invoke代码维护...通过接口和队列来规范非UI线程操UI的实现。

    Android 线程开发 开发实例

    些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。 但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI...

    Android 消息队列模型详解及实例

    Android中除了UI线程(主线程),创建的工作线程默认是没有消息循环和消息队列的。如果想让该线程具有消息队列和消息循环,并具有消息处理机制,就需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用...

    .Net 多线程详解

    • 为什么Winform不允许跨线程修改UI线程控件的值 • 有没有什么办法可以简化WinForm多线程的开发 线程池 • 线程池的作用是什么? • 所有进程使用一个共享的线程池,还是每个进程使用独立的线程池? • 为什么...

    权威.NET多线程详解(源码示例)

    • 为什么Winform不允许跨线程修改UI线程控件的值 • 有没有什么办法可以简化WinForm多线程的开发 线程池 • 线程池的作用是什么? • 所有进程使用一个共享的线程池,还是每个进程使用独立的线程池? • 为什么...

    android+多线程机制的讲解和例子

    1.Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 2.Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper(从Message Queue...

    .net 线程详解 基础篇

    * 为什么Winform不允许跨线程修改UI线程控件的值 * 有没有什么办法可以简化WinForm多线程的开发 线程池 * 线程池的作用是什么? * 所有进程使用一个共享的线程池,还是每个进程使用独立的线程池? * 为什么不要...

    worker线程处理时,同时刷新对话框消息

    在DoMadal时,mainwnd会把消息处理队列处理转让给DLG来进行处理,当进入线程时,SendMessage,转到DLG窗口线程要进行处理,而此时窗口线程正一直在while(1)中,无法去处理SendMessage的消息,而UI线程又在等待着WORK...

    Qt实现串口通信(利用windows API实现串口枚举,多线程、生产者消费者模型实现数据解析)

    Qt实现串口通信(利用windows API实现串口枚举,多线程、生产者消费者模型实现数据解析); 自定义事件,向UI界面提供数据交互接口; 自定义队列,支持线程安全。

    android 服务组件多线程交互

    android 的service和activity是运行在UI主线程的。在android线程中,只有主线程即UI线程有自己的默认的消息队列。子线程需要创建自己的消息队列,并把消息发给队列,并循环起来,发给handler处理。

    CWinThread继承类的问题

    MFC的CWinThread线程有两种,一种称为Work线程,一种称为UI线程。一般情况下Work线程与UI线程的区别主要在于UI线程有消息队列(并不是有没有界面,这点要注意,UI线程也是可以没有界面的)

    winform 多线程处理数据

    winform 编写工具,多线程处理数据工具模版,实现多线程异步更新UI等操作

    android-thread-producer-consumer-example:线程之间的ProducerConsumer模型示例

    想象一下,我们在UI线程和另一个写入数据库的后台线程上进行了读取。 后台线程必须将消息发布到两个处理程序。 将邮件发送到目标后,我们无法调整其优先级。 消息队列是FIFO。 后台线程只是将消息转储到队列中,...

    QT串口422通信队列交互

    串口422通信,队列、多线程、UI、QT交互

    EventBus五种ThreadMode

    1. ThreadMode: POSTING 事件处理和post在同一个线程中,如果是UI线程注意耗时操作。 2. ThreadMode: MAIN 事件处理将在Android的主线程(UI线程)中被调用。 3. ThreadMode: BACKGROUND 事件处理将在后台线程中被调用,...

    android使用handlerthread创建线程示例

    在android开发中,一说起线程的使用,很多人马上想到new Thread(){…}.start()这种方式。这样使用当然可以,但是多次使用这种方式,会创建多...Looper是用于实现消息队列和消息循环机制的。因此,如果是默认创建Handler

    android开发教程之子线程中更新界面

    每个Handler对象与创建它的线程相关联,并且每个...由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。 通过Runnable在子线程中更新界面的例子 在onCreate中创建Handler 代码如下:p

    Android 消息机制详解及实例代码

    Android应用启动时,会默认有一个主线程(UI线程),在这个线程中会关联一个消息队列(MessageQueue),所有的操作都会被封装成消息队列然后交给主线程处理。为了保证主线程不会退出,会将消息队列的操作放在一个死...

Global site tag (gtag.js) - Google Analytics