当前位置:首页 > 智能硬件 > 人工智能AI
[导读] 开始着手写这个WPF系列,这里的一站式,就是力争在每一个点上能把它讲透,当然,做不到那么尽善尽美,如果有不对的地方也欢迎朋友们指正,我会逐步补充,争取把这个系列写好。 通常,WPF 应用

开始着手写这个WPF系列,这里的一站式,就是力争在每一个点上能把它讲透,当然,做不到那么尽善尽美,如果有不对的地方也欢迎朋友们指正,我会逐步补充,争取把这个系列写好。

通常,WPF 应用程序从两个线程开始:一个用于处理呈现,一个用于管理 UI。呈现线程有效地隐藏在后台运行,而 UI 线程则接收输入、处理事件、绘制屏幕以及运行应用程序代码。

UI 线程对一个名为 Dispatcher 的对象内的工作项进行排队。 Dispatcher 基于优先级选择工作项,并运行每一个工作项,直到完成。每个 UI 线程都必须至少有一个 Dispatcher,并且每个 Dispatcher 都只能在一个线程中执行工作项。

这两段是MSDN上关于WPF线程模型的描述。主要介绍了两个概念:一,WPF中线程一分为二,一个用于呈现(Render),一个用于管理UI;二,在UI线程中,使用了一个名为Dispatcher的类帮助UI线程处理任务。

那么这个线程模型和Dispatcher到底是怎样的呢,它又有什么特点,有什么优缺点呢?在正式分析线程模型和Dispatcher之前,我先找一个插入点,希望这个插入点能为朋友们所理解。

作为一个PresentaTIon的基架,WPF的使命就是要编写图形化的操作界面。而在Windows操作系统上,图形化界面是建立在消息机制这个基础上的,那么创建一个窗口,要经历哪些步骤呢?

1. 创建窗口类。 WNDCLASSEX wcex; RegisterClassEx(&wcex);

2. 创建窗口。CreateWindow(…); ShowWindow(…); UpdateWindow(…);

3. 建立消息泵。

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

打个比方,我们在一个自动化的厂房里生产设备。基于正规,我们会首先定义好该设备的模板,这就是创建窗口类,这里”类”更多表示类别的意思。模板定义完毕,我们可以正式生产设备了,这就是创建窗口,这个CreateWindow的时候会通过字符串来匹配到我们定义的模板(窗口类)。创建成功后,我们要让设备动起来,就要像人一样,体内一定要有类似于血液的流传机制,把命令传达到设备的各个部分,这就是消息泵,这个泵就像我们的心脏一样,源源不断的通过GetMessage并Dispatch来分发血液(消息)。既然我们通过消息来对设备下达指令,那么就要有消息队列来存储消息,在Windows中,线程为基本的调度单位,这个消息队列就在线程上,当循环使用GetMessage时,就是在当前线程的消息队列中任劳任怨的取出消息,然后分发到对应的窗口中去。

那么具体到WPF,它又是一个怎么样的情况,如何和老的技术兼容,又有什么新的突破呢?

WPF引入了Dispatcher的概念,这个Dispatcher的主要功能类似于Win32中的消息队列,在它的内部函数,仍然调用了传统的创建窗口类,创建窗口,建立消息泵等操作。Dispatcher本身是一个单例模式,构造函数私有,暴露了一个静态的CurrentDispatcher方法用于获得当前线程的Dispatcher。对于线程来说,它对Dispatcher是一无所知的,Dispatcher内部维护了一个静态的List _dispatchers, 每当使用CurrentDispatcher方法时,它会在这个_dispatchers中遍历,如果没有找到,则创建一个新的Dispatcher对象,加入到_dispatchers中去。Dispatcher内部维护了一个Thread的属性,创建Dispatcher时会把当前线程赋值给这个Thread的属性,下次遍历查找的时候就使用这个字段来匹配是否在_dispatchers中已经保存了当前线程的Dispatcher。

那么这个创建窗口,建立消息泵又是什么时候被调用的呢?在Dispatcher内部,维护了一个HwndWrapper的字段,在Dispatcher的构造函数中,调用了HwndWrapper的构造函数,这个创建窗口类,创建窗口就是在这个函数中被调用的。这里实际的类是MessageOnlyHwndWrapper,这个Message-Only,是Windows编程中常用的伎俩,创建一个隐藏窗口,仅仅用来派发消息。那么循环读取消息的消息泵又是什么时候建立起来的呢?

Dispatcher对外提供了一个静态的Run函数,顾名思义,就是启动Dispatcher,在函数内部,调用了PushFrame函数,在这个函数中,可以找到熟悉的GetMessage, TranslateAndDispatchMessage。那么这个PushFrame是怎么回事,Frame这个概念又是如何而来的呢?

这个就是WPF引入的一个新的概念,嵌套消息泵,就是在一个While(GetMessage(。..))内部又启动了一个While(GetMessage(。..))。每调用一次PushFrame,就会启动一个新的嵌套的消息泵。每调用一次GetMessage,就在线程的消息队列中取出一个消息,直至取出WM_QUIT的时候GetMessage才返回False。这个GetMessage函数Windows内部进行了处理,当消息队列为空时,挂起执行线程,避免死循环的发生。关于嵌套消息泵的优缺点,我们稍后再讲,先来看看Dispatcher是如何处理任务的:

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

2024年4月12日,中国--服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)宣布,松下自行车科技有限公司(Panasonic)宣布采...

关键字: 人工智能 电动自行车

4月17日消息,斯坦福大学近日发布《2024年AI指数报告》(AI Index Report 2024),凭借AI在大规模胰腺癌早筛上的创新突破,阿里达摩院(湖畔实验室)医疗AI入选科学与医疗领域的年度亮点研究(High...

关键字: AI 人工智能 集成电路

4月17日消息,去年,中国大陆的半导体设备支出约占据了全球总额的三分之一。

关键字: 半导体 传感器 人工智能 电动汽车

该实验室的创新技术能够增强人工智能边缘解决方案,提高神经网络能力

关键字: 人工智能 神经网络

机器学习作为人工智能领域的重要组成部分,其过程涉及到多个核心环节。本文将详细阐述机器学习的四个主要步骤:数据准备、模型选择、模型训练与评估,以及模型部署与应用,以揭示机器学习从数据到应用的完整流程。

关键字: 数据 人工智能 机器学习

随着信息技术的迅猛发展和大数据时代的到来,机器学习成为了人工智能领域中的核心技术之一。机器学习是通过模拟人类学习行为,使计算机系统能够从数据中自动发现规律、提取特征并进行预测和决策的过程。它在诸多领域取得了广泛的应用,包...

关键字: 计算机 人工智能 机器学习

机器学习算法是人工智能领域中的核心技术之一,它通过对大量数据进行学习,自动发现数据中的规律和模式,从而实现对新数据的预测、分类、聚类等任务。本文将深入探讨机器学习算法的基本过程,包括数据准备、模型选择、训练与评估等关键步...

关键字: 数据 人工智能 机器学习

机器学习是人工智能领域的一个重要分支,它使用各种算法来使计算机系统能够从数据中学习和改进,而无需进行明确的编程。在机器学习的广阔领域中,有多种算法被广泛应用,每种算法都有其独特的适用场景和优势。本文将详细介绍机器学习中的...

关键字: 机器学习 人工智能 计算机

尼得科株式会社将扩大其位于泰国的服务器用水冷模块CDU(Coolant Distribution Unit)生产线,计划在目前的月产能200 台基础上于 2024 年 6 月增加到每月 2,000 台。

关键字: 人工智能 电源 电路板

随着大数据时代的到来和计算能力的不断提升,机器学习作为人工智能领域的重要分支,正逐渐改变我们的生活方式和工作模式。机器学习涉及多个学科的理论和技术,其应用广泛且深入,为各个领域的发展带来了前所未有的机遇。那么,机器学习具...

关键字: 大数据 机器学习 人工智能
关闭
关闭