当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]在多实例多线程情况下,ActiveX 组件的不同实例共享同一全局数据缓冲区,在改造集成面向过程开发的传统代码时必须修改代码以消除全部全局变量。

在多实例多线程情况下,ActiveX 组件的不同实例共享同一全局数据缓冲区,在改造集成面向过程开发的传统代码时必须修改代码以消除全部全局变量。针对该情况,使用线程局部存储技术实现全局变量的局部化,采用具有大量全局变量的实体仿真代码实现ActiveX封装。该技术已成功应用于基于工业以太网的多通道数控系统中。 

1 概述

组件对象模型(Component Object Model, COM)是由美国微软公司提出的一种二进制代码互操作规范,ActiveX 是实现了一些特定接口(例如IDispatch)的标准COM 组件。

COM/ActiveX 规范已成为软件业内最重要的工业标准之一。

基于组件的软件构架方法通过重用已有的软件组件,可使软件开发者像搭积木一样快速构造应用软件,从而提高生产效率,使软件设计更加规范可靠。目前基于组件的软件开发方法已经在业界得到广泛应用。在数控系统中也使用组件技术实现加工仿真,但现有文献较少涉及多个ActiveX 组件实例的情况。ActiveX 组件采用类似Windows消息运行机制的单套间模型(Single Threaded Apartment, STA)来串行化对组件属性和方法的调用,即对ActiveX 组件的所有调用由COM 系统负责线程的同步。因此,该组件的调用是线程安全的。

COM 在STA 套间内的线程中创建一个隐藏窗口,将套间外的线程对这个对象的调用都转变成对隐藏窗口发送消息,并由隐藏窗口的消息处理函数来实际调用组件对象,从而实现STA 套间模型。

一个进程中的所有线程均处于同一虚拟地址空间,每个函数的局部变量在运行该函数的每个线程中都是唯一的,但静态和全局变量则被所有线程所共享。即在多个ActiveX 组件实例的情况下,ActiveX 组件的 STA 模型不能保证全局数据成员是线程安全的。

2 线程局部存储原理

线程局部存储(Thread Local Storage, TLS)是Win32 系统提供的一种简化多线程程序设计的底层基础技术,其实质是介入全局数据创建过程,建立并管理全局数据与线程的关联,使得全局数据为其关联线程所私有。TLS 原理如图1 所示。


每个进程拥有一组TLS 槽口(Slot),每个槽口用序号标识,Windows 2000 有1 088 个这样的槽口。线程通过API 函数可以分配TLS 槽口,在TLS 槽口存取数据,进程中使用同一个序号的不同线程可指向独立的局部堆内存中进行数据存储,即线程ID 和槽口号确定了一个二维空间映射,线程通过API 函数获得线程间相互独立的数据存储地址。

图 1 也表明了采用TLS 机制的具有2 个ActiveX 组件实例的运行时软件内存结构,进程分配了2 个TLS 索引值gdwTlsIndex1 和 gdwTlsIndex2,这2 个索引值代表了TLS槽口的序号,但不同线程按照相同的序号却得到2 个独立的局部堆地址,而这些数据在线程内却具有全局数据的可访问性,即每个线程有单独的全局数据拷贝,该数据对线程内的函数具有全局作用域。

Win32 系统中与TLS 有关的API 及用法如下:

(1)进程初始化时分配TLS 槽口:

DWORD gdwTlsIndex;gdwTlsIndex = TlsAlloc();

(2)调用TlsSetValue 保存数据:

LPVOID lpvBuffer;lpvBuffer = (LPVOID) LocalAlloc(LPTR, 256);

TlsSetValue(gdwTlsIndex, lpvBuffer); //保存存储区指针

(3)调用TlsGetValue 取数据:

LPVOID lpvData;lpvData = TlsGetValue(gdwTlsIndex); //取TLS 槽口中保存的存//储区指针

(4)调用TlsFree 释放槽口:

lpvBuffer = TlsGetValue(gdwTlsIndex);

LocalFree((HLOCAL) lpvBuffer); //释放存储区

TlsFree(gdwTlsIndex); //释放TLS 槽口

3 应用实例

一种基于Z-Buffer 的铣削实体加工仿真算法,华中数控HNC-32 数控系统HMI 的仿真系统继承自该代码,其主要结构如下:


可见,显示缓存等核心数据结构设计为全局变量,但HNC-32 的设计目标是多通道数控系统,每个通道都需要一个实体加工仿真组件的实例,由于全局缓存数据为所有实例共享,因此出现的所有通道显示内容将完全一致,无法实现多通道仿真。为简化改造工作,将原系统中约50 多个全局变量合并为一个结构,并将原全局变量作为其成员,即一个大的结构变量包括了50 个原全局变量。

按照 TLS 要求该结构变量必须动态创建,如下代码表明了它的声明、创建过程,代码还表明每个ActiveX 组件构造时即调用API 函数TlsAlloc 获得一个线程索引,在局部堆申请到存储空间后用API 函数TlsSetValue 将该存储区地址与线程索引对应。



在其他函数中,可以通过线程索dwTlsIndex 调用API函数TlsGetValue 引访问到上述大结构变量,进而访问到原全局变量,代码如下:

//被OpenPatg->hFile 调用读刀位文件并显示刀位轨迹

int CSimuCtrlBCtrl : ShowPath(FILE *fp){

GlobalValues *g=(GlobalValues *)TlsGetValue(dwTlsIndex);

g->CtrlObj->GetClientRect(&rt);...

应用实例界面如图 2 所示。


在 TLS 改造后,每个ActiveX 实例均有单独的、与线程索引对应的局部堆全局变量,各个通道运行不同的代码程序并在各自通道的实体仿真上显示各自的运行结果,实现了多通道的独立执行。

4 结束语

基于组件的应用软件结构具有先进性,但在多实例条件下必须实现各实例全局数据的独立性,线程局部存储技术是最佳解决方案。在解决传统非面向对象开发的代码改造问题时,本文提出的改造方式具有对原有代码改动少、逻辑关系清楚等优点。在华中数控基于工业以太网现场总线的新一代多通道HNC-32 数控系统中的成功应用表明了该方法具有实用性。

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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭