跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
点火电阻捷比信 · 专业器件主题站

WPF应用程序的前两个线程简介

我开始手工编写此WPF系列。这里的一站式商店力求在每个方面都对它进行彻底的解释。当然,它不可能如此完美。如果有什么问题,欢迎朋友指正。我将逐渐添加它。力求写得很好。通常,WPF应用程序从两个线程开始:一个用于处理渲染,另一个用于管理UI。呈现线程有效地隐藏并在后台运行,而UI线程接收输入,处理事件,绘制屏幕并运行应用程序代码。 UI线程将工作项在名为Dispatcher的对象中排队。分派器根据优先级选择工作项目,并运行每个工作项目直至完成。每个UI线程必须至少具有一个Dispatcher,并且每个Dispatcher只能在一个线程中执行工作项。这两段是MSDN上WPF线程模型的描述。主要介绍两个概念:首先,WPF中的线程分为两个,一个用于渲染(Render),另一个用于管理UI。其次,在UI线程中,使用名为Dispatcher的类来帮助UI线程处理任务。那么,此线程模型和Dispatcher到底是什么,它的特征是什么,它的优点和缺点是什么?在正式分析线程模型和Dispatcher之前,我首先找到一个插入点,希望我的朋友可以理解该插入点。作为PresentaTIon的框架,WPF的任务是编写图形用户界面。在Windows操作系统上,图形界面是基于消息机制构建的,那么创建窗口要经过哪些步骤? 1.创建一个窗口类。 WNDCLASSEX wcex; RegisterClassEx(& amp; wcex); 2.创建一个窗口。 CreateWindow(& hellip;); ShowWindow(& hellip;); UpdateWindow(& hellip;); 3.创建一个消息泵。 while(GetMessage(& amp; msg,NULL,0,0)){TranslateMessage(& amp; msg); DispatchMessage(& amp; msg);}例如,我们在自动化工厂生产设备。基于形式,我们将首先定义设备的模板,该模板将创建窗口类,其中“类”是窗口类。更多意味着类别。定义模板后,我们就可以正式生产设备了。这是窗口的创建。创建CreateWindow时,它将与我们通过字符串定义的模板(窗口类)匹配。创建成功后,我们必须使设备像人一样移动。体内必须有类似血液的循环机制,才能将命令传输到设备的所有部分。这是消息泵。这个泵就像我们的心。 ,通过GetMessage和Dispatch连续分配血液(消息)。由于我们通过消息向设备发出指令,因此必须有一个消息队列来存储消息。在Windows中,线程是基本的调度单元。该消息队列在线程上。循环使用GetMessage时,它位于当前线程中。将消息毫无疑问地从消息队列中取出,然后将其分发到相应的窗口中。那么对于WPF而言,它是一种什么样的情况,它与旧技术如何兼容,它又有哪些新的突破? WPF引入了Dispatcher的概念。此分派器的主要功能类似于Win32中的消息队列。在其内部功能中,它仍然调用传统的窗口创建,窗口创建和消息泵操作。 Dispatcher本身是单例模式,构造函数是私有的,并且公开了一个静态CurrentDispatcher方法来获取当前线程的Dispatcher。对于线程,它对Dispatcher一无所知。分派器在内部维护一个静态List _dispatchers。每当使用CurrentDispatcher方法时,它将在此_dispatchers中遍历。如果找不到,它将创建一个新的。 Dispatcher对象已添加到_dispatchers。分派器在内部维护Thread属性。创建分派器后,当前线程将分配给Thread属性。下次您遍历搜索时,此字段将用于匹配当前线程的Dispatcher是否已保存在_dispatchers中。那么什么时候调用创建窗口和消息泵的创建呢?在分派器内部,维护了HwndWrapper的字段。在Dispatcher的构造函数中,将调用HwndWrapper的构造函数。这将创建一个窗口类,并在此函数中创建一个窗口。这里的实际类是MessageOnlyHwndWrapper。此仅消息传递是Windows编程中创建隐藏窗口(仅用于分发消息)的常用技巧。那么何时周期性地建立读取消息的消息泵?分派器在外部提供了静态运行功能。顾名思义,它启动了Dispatcher。在函数内部,将调用PushFrame函数。在此功能中,您可以找到熟悉的GetMessage和T