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 所示。
图2 应用实例界面
在 TLS 改造后,每个ActiveX 实例均有单独的、与线程索引对应的局部堆全局变量,各个通道运行不同的代码程序并在各自通道的实体仿真上显示各自的运行结果,实现了多通道的独立执行。
4 结束语
基于组件的应用软件结构具有先进性,但在多实例条件下必须实现各实例全局数据的独立性,线程局部存储技术是最佳解决方案。在解决传统非面向对象开发的代码改造问题时,本文提出的改造方式具有对原有代码改动少、逻辑关系清楚等优点。在华中数控基于工业以太网现场总线的新一代多通道HNC-32 数控系统中的成功应用表明了该方法具有实用性。