`
f002489
  • 浏览: 273201 次
  • 性别: 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消息队列

    在探讨Windows应用程序的工作原理时,理解UI线程和消息队列的概念至关重要。UI线程(User Interface Thread)与消息队列(Message Queue)是实现用户交互的核心机制,它们确保了应用程序能够正确响应用户的输入。 #### ...

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

    理解UI线程和消息队列的工作原理对于编写高效、响应式的Windows应用程序至关重要。开发者必须确保UI线程不被长时间阻塞,以免影响用户界面的更新和响应。此外,合理利用消息机制可以实现异步操作,提高程序的并发...

    UI 线程 和 工作线程 的实现

    UI线程是应用程序的主线程,负责处理消息循环,即通过`Run()`方法不断检查消息队列并分发消息。 2. **创建工作线程**:要创建一个工作线程,我们需要继承`CWinThread`类并重写其`ExitInstance()`和`Run()`方法。在`...

    MFC UI 线程的使用

    本篇文章将深入探讨"MFC UI线程的使用",包括CWinThread类的运用、UI线程间的消息传递机制,以及如何利用ON_THREAD_MESSAGE宏和PostThreadMessage函数来实现线程间的通信。 首先,我们来看MFC中的CWinThread类。...

    无界面的UI线程交互

    在05交互式UI线程这个文件中,可能包含了更具体的代码示例和实现细节,比如如何创建和管理线程,如何定义和使用消息传递机制,以及如何在不同线程间安全地交换数据。深入学习这些内容将有助于开发者更好地理解和应用...

    多线程使用消息队列

    在IT行业中,多线程和消息队列是两种常见的并发处理和系统通信技术。多线程使得一个程序能够同时执行多个任务,而消息队列则是实现进程间通信(IPC)的有效方式,尤其在分布式系统中广泛应用。下面我们将深入探讨这...

    MFC创建UI线程

    这是UI线程的核心部分,因为`PumpMessage()`会不断检查消息队列,处理来自窗口的消息。 5. **资源管理**:确保线程在完成其工作后正确地清理资源。在`ExitInstance()`函数中,可以释放线程所占用的资源。 在给定的...

    Android_子线程创建消息队列更新UI

    总之,Android应用开发中,正确处理子线程与UI线程的交互是非常重要的。通过理解和运用消息队列机制,我们可以确保应用的响应性和稳定性,同时避免潜在的性能问题。学习并熟练掌握Handler、Looper和Message的使用,...

    C#多线程消息处理例子

    通过分析和运行这个项目,开发者可以更直观地了解如何在C#中实现多线程消息处理,以及如何在后台线程和UI线程之间进行有效通信。 总结来说,这个C#多线程消息处理例子展示了如何在后台线程中执行任务并安全地将结果...

    工作线程 UI线程实例

    当工作线程完成任务后,通常会通过消息队列或回调函数将结果通知UI线程,更新界面。 在实际编程中,使用工作线程和UI线程的关键在于同步和通信。例如,Android中的Handler、Looper和Message机制,或者Windows中的...

    C# 线程更新UI界面

    否则,它会在UI线程的的消息队列中排队,等待执行。 - `Control.BeginInvoke`:异步版本的Invoke,它会将方法调用放入消息队列,然后立即返回,无需等待方法执行完成。 5. **示例代码** ```csharp // 创建一个...

    C# winform可忽略消息的自定义消息队列

    为了解决这个问题,我们可以采用自定义消息队列来优化处理流程,从而实现异步处理,避免UI线程被长时间占用。 标题中的“C# Winform可忽略消息的自定义消息队列”指的是创建一个特定的机制,允许在WinForm应用中,...

    ndroid异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    在非UI线程中,我们可以通过`Looper`来创建一个消息循环,然后通过`Handler`发送消息到UI线程。`Looper`是Android系统中的消息队列管理器,它在主线程中默认已经启动了消息循环,而在子线程中需要手动调用`Looper....

    WPF 使用线程更新UI

    BeginInvoke是异步的,不会阻塞当前线程,而是将更新任务放入消息队列等待执行。 5. **数据绑定的线程安全**:WPF的数据绑定机制默认是线程安全的,但如果直接在后台线程修改绑定源,可能会引发异常。正确做法是先...

    安卓UI线程机制 ,在子线程中访问UI

    在Android系统中,UI线程(也称为主线程)是应用程序与用户交互的主要通道,它负责处理所有的用户界面更新和事件响应。理解Android的UI线程机制至关重要,因为错误地在非UI线程中操作UI组件会导致应用崩溃或出现不...

    WPF后台线程更新UI

    - **Invoke方法**:后台线程可以通过调用`Dispatcher`的`Invoke`方法将操作添加到UI线程的消息队列中。一旦UI线程空闲,就会执行这些操作。 ```csharp Dispatcher.Invoke(new Action(() => { // 在这里更新UI })); ...

    Looper和Handler实现UI线程和子线程的通信

    它们通过消息队列和消息传递的方式,确保了非UI线程能够安全地更新UI,避免了因直接在非UI线程中进行UI操作而导致的"Application Not Responding"(ANR)错误。开发者应当熟练掌握这一机制,以实现高效且稳定的...

    java多线程解决消息压入栈和取出

    总的来说,Java的多线程和消息队列机制提供了一种高效且灵活的方式来管理和协调并发任务,尤其是在网络访问、IO操作和其他耗时任务中,能够显著提升程序的并发能力和整体性能。通过合理设计线程间的交互和同步机制,...

    workquere工作队列 多线程

    这样可以避免阻塞UI线程,提高用户体验。 在"C#实现的工作队列,workquere,多线程管理"项目中,我们可以推断出以下几个关键知识点: 1. **线程池**:C#中的`System.Threading.ThreadPool`类是工作队列的基础,它...

    c#多线程+队列实现类似QQ消息提示框

    综上所述,"c#多线程+队列实现类似QQ消息提示框"项目结合了多线程和队列的优势,以高效且有序的方式处理消息提示,实现了与QQ消息提示框相似的体验。通过这个项目,开发者可以学习到如何在C#中运用多线程技术优化UI...

Global site tag (gtag.js) - Google Analytics