2023年11月30日发(作者:)

卷第

301Vol.30No.1

20021JOURNALOFHOHAIUNIVERSITYJan.2002

基于的多线程实时测控系统的设计与实现

VB

高春雷,高新陵

(河海大学水利水电工程学院,江苏南京

210098

摘要:介绍在环境下基于多线程的压力机床测控系统的设计与实现过程,对该测控系统的技术

VB

特点、软件设计方法进行了具体论述,并给出在中用技术实现多线程实时测控的系统

VBActiveX

框架该系统已成功地应用于一大型汽车制造企业的生产过程

..

关键词:多线程;实时测控

VisualBasic

中图分类号:文献标识码:文章编号:

TH122A20021000198001004905

---

发动机镶缸套压力机床是汽车发动机生产线的重要设备之一,对该压力机床工作过程的压力信号实时

检测,是控制发动机镶缸套质量的重要手段,检测信号的分析结果可控制压力机床的运动,同时可为调整生

产线前部相关工序提供参考

.4

该数据测量系统需要对路压力信号和对应的高度信号进行持续的在线实时

测量,数据范围是压力值高度值测量误差允许范围小于或等于测量频率

0+65kN-100180mm0.8%

4s.290

之内完成一路信号的检测和处理系统必须对多个采样数据或基于采样数据的统计参数实现实时

超界报警

.

由于在采集界面下需要在较短的时间内完成数据采集、去噪声、数据整理与修复、压力数据实时图表显

示、数据分析计算、超界实时报警以及数据存储与管理等任务,如果仅使用单线程模型来设计系统,就不能很

好地完成数据采集和监控的任务,因此考虑采用多线程模型,利用多个线程分别完成各项任务

.

在多种可视

化编程语言中,已经在测控系统中得到因可以让开发者快速创建强大的应用程序而免除不必要的细节,

VB

了广泛的应用但如何用开发基于多线程的测控系统尚有一定的难度本文就如何用于多线程测控

.VB.VB

系统的软件设计作了较为系统的阐述,并给出了实现该系统的框架

.

1VisualBasic

1.1

多线程应用程序的设计

线程概述

应用程序的一个运行实例称作进程,每个进程可以包括一个或多个线程所有属于该进程的线程都共享

.

进程的资源,地址空间以及对象句柄等利用多线程机制可以实现进程内的各个子任务并行执行,

CPU.

而提高系统的实时性能

.

1.2VB

中多线程应用程序的实现

自由线程模型和单元线程模型中的线程模型有两种主要形式:

FreeThreadModelApartmentThreadVB

每一线程可访问全部进程的数据区域,而且所有线程共享应用程序的全局变量在自由线程模型中,

.Model.

这样的线程模型,优点是各线程之间通讯比较方便,缺点是不利于实现各线程之间的同步在单元线程模型

.

中,一个单元中可以有一个或多个线程,同一单元中的线程可以互相通讯,而不同单元之间的线程则不可以

.

这种线程模型有利于实现线程之间的同步,而不利于线程之间的通讯(主要是指不同的单元中封装的线程之

间的通讯)

单元线程模型比自由线程模型能更安全些,因此在实际系统设计中运用较广泛总的来说,

..

包括多线程组件和多线程组件此外,可以创建多线程组件,

ActiveXEXEActiveXDLL.VB6ActiveXVB6

也可以很方便地创建多线程普通应用程序,程序中可以选择不同的线程模型,但必须具备以下个条件:

3

a.ThreadPerObjectActiveXEXE

应用程序必须是用设置编译的服务器;

收稿日期:

20001229

--

作者简介:高春雷—)男,江苏武进人,硕士研究生,机械设计及理论专业,主要从事计算机网络及应用研究

1973.

50

20021

b.MultiUse

在不同的线程中运行的任务代码必须嵌在某个使用的类中;

必须用函数而不是操作创建新对象(有关本限制条件的说明:创建新对象时,

CreateObjectNewac..

一点是保证由同一个运行组件提供对象,在执行时就不会产生组件的其他副本

由于使用操作时,

New.b

从而绕过这样就不能保证对象是可创建的会用更有效的但不含任何限制的结构来创建对象,

COMVB

1

MultiUse.

2

系统线程的设计与实现

通过分析系统需求,为了实现高速采集和处理数据并完成实时显示及监控实际压力数据,本系统主界面

创建为

ActiveXEXE3a

服务器类型,采用单元线程模型,共使用了个线程:主线程,负责管理通常的前台界

面处理,并接收和处理来自控制机柜面板上的按钮信号;数据采集线程,负责数据的采集、平滑和去噪,

b

送入数据缓冲区供其他线程使用;数据处理线程,负责对数据缓冲区中的最新数据进行显示实时压力曲

c

线,并负责实时超界报警

.3.

下面对个线程作进一步的介绍

2.1

主线程的设计

主线程设计的主要任务是创建窗口,管理主界面上的键盘和鼠标输入,创建两个工作子线程,并控制子

线程的存活在多线程组件中,无论何时创建新线程都会执行过程因此,程序中必须能够

.ActiveXSubMain.

识别出在创建的线程是否为第一个组件线程

..

如果是,则需要显示窗体主要有两种识别方法,第一种基于

判断窗体是否已经存在第二种是基于函数,利用提供的对函数,

.FindAtomAPIWindowsAPIFindWindowAPI

原型的操作来测试已知原型是否存在,判断线程是否为第一个组件线程

.

本系统采用第二种方法,为此需要创建类,用于创建原型,并在退出程序时摧毁原型具体

CThread.

CThread

类的实现如下:

'WindowsAPI.

有关原型操作的函数的申明

PrivateDeclareFunctionFindAtomLib"kernel32"Alias"FindAtomA"ByValatomNameAsStringAsInteger

PrivateDeclareFunctionAddAtomLib"kernel32"Alias"AddAtomA"ByValatomNameAsStringAsInteger

PrivateDeclareFunctionDeleteAtomLib"kernel32"

ByValatomNameAsIntegerAsInteger

PrivateatomIDAsInteger

'.

线程初始化

PrivateSubClass-Initialize

DimatomNameAsString

'.

创建应用实例的原型唯一名字

atomName=App.EXEName&App.hInstance

就创建该原型如果原型不存在,

.

'

atomName=0ThenatomID=AddAtomatomNameIfFindAtom

EndSub

删除该原型在线程终止时,

.

'

PrivateSubClass-Terminate

IfatomIDThenDeleteAtomatomID

EndSub

用于判断创建原型的线程是否为第一个线程函数,

.

'

AsBooleanFunctionIsFirstThread

IsFirstThread=atomID<>0

EndFunction

过程中,类的使用以及多线程应用程序的架构如下:

SubMainCThread

'Thread.

申明全局变量

PublicThreadAsNewCThread

PublicblThreadContainAsBoolean

卷第高春雷,基于的多线程实时测控系统的设计与实现

301VB

51

用于控制子线程的同步退出全局存活标志变量,

.'

主线程退出时置为默认值为

FALSE.'TRUE

SubMain

IfThread.IsFirstThreadThen

'.

判断是不是系统创建的第一个线程

IfApp.StartMode=vbSModeAutomationThen

Err.Raise9999"Unabletobeinstantiatedasacomponent"

EndIf

'

创建系统主界面

frmMainForm.

frmMainForm.Show

'

创建两个工作子线程

.

DimCollectDataAsCCollectProcessDataasCProcess

"MThrApp.CCollect"SetCollectData=CreateObject

"MThrApp.CProcess"SetProcessData=CreateObject

blThreadContain=TRUE'TRUE.

设置全局存活变量为

CallByNameCollectData"CollectStart"VbMethod'

激活对象

CallByNameProcessData"ProcessStart"VbMethod'

激活对象

Else

'.

不是系统创建的第一个线程

EndIf

EndSub

2.2

数据采集线程的设计

定义一个类把有关数据采集的动作封装在该类中,实现时必须保证数据采集类

CCollectCCollect

采集端口数据通过调用数据采集卡提供的中的函数来实现下面是类型为其中,

DLL.InstancingMultiUse.

CCollect

类的大体框架:

()

SubCollectStart

StaticactiveAsBoolean

IfactiveThenExitSub'.

防止重进入线程

active=True

DoUntilnotblThreadContain

主线程退出时该变量被置为子线程退出全局存活标志变量,

FALSE.'blThreadContain

检测端口,采集数据调用提供的采集函数,

.'DLL

去噪对采集的数据进行平滑、

.'

填满缓冲区后,置缓冲区存取标志为向数据缓冲区填充数据,

TRUE.

'

Loop

active=False

EndSub

2.3

数据处理线程的设计

定义一个类

CProcess

主要是循环测试缓冲区的存取标志,在存取许可的情况下,读取缓冲区的数据,

行处理即显示实时压力曲线和实时超界报警以及保存数据到数据库中,实现时

CProcessInstancingMultiUse.CProcess

类型为下面是类的框架:

()

SubProcessStart

StaticactiveAsBoolean

IfactiveThenExitSub'

防止重进入线程

.

active=True

52

20021

DoUntilnotblThreadContain

主线程退出该变量置为子线程退出全局存活标志变量,

FALSE.'blThreadContain

则进行数据处理循环判断数据缓冲区的存取标志变量,

BufferFullTRUE.'

IfBufferFull1Then

显示实时压力变化曲线读取数据,

.

'

判断压力值是否在规定范围内,否则调用中的函数,读取工艺参数,

DLL'

如果严重超限,控制警铃响控制报警灯亮,

.'

BufferFull1=False'

标识数据缓冲区中的数据已经处理

.

EndIf

IfBufferFull2Then

显示实时压力变化曲线读取数据,

.

'

判断压力值是否在规定范围内,否则调用中的函数,读取工艺参数,

DLL'

如果严重超限,控制警铃响控制报警灯亮,

.'

BufferFull2=False'

标识数据缓冲区中的数据已经处理

.

EndIf

Loop

active=False

EndSub

3

多线程应用系统中数据缓冲区的设计

2

为了进一步提高数据采集处理的实时性,系统采用双缓冲区设计实现中主要是要解决对缓冲区的并

发和同步问题

.

(见图数据采集线程已经开双缓冲区的工作方式即缓冲区中的数据正被数据处理线程使用时,

1a..1

始采集下一批数据到缓冲区了,如此反复交替中实线箭头表示在周期时两子线程的读写指针的位

2.1T

置,虚线箭头表示在周期时两子线程的读写指针的位置

T+1.

卷第高春雷,基于的多线程实时测控系统的设计与实现

301VB

53

通过反复研究和实验,认为以下措施是有效的

.

4.1

注意释放内存,避免线程阻塞

在系统的调试过程中,发现

WindowsNTWorkstation

环境下有一个缺陷,就是当某个任务持续长时间运行

时,会导致所占用的存储空间逐渐膨胀,因此有时会因内存自由空间的过少而出现有关线程阻塞的现象,

至出现死机现象故在开发程序的过程中,必须考虑有效措施使程序能自动释放内存

..

4.2CPU

注意节约占用的时间

系统规定数据采集线程和数据处理线程的优先级为最高,其余任务必须注意节约占用的时间,

CPU

则会降低系统的运行效率

.

4.3

合理规划线程内容,控制线程个数

虽然系统采用多线程模型可以有效地提高采集和监控效率,但系统中所拥有的线程不能太多因为可运

.

行的线程越多,对所有线程轮询一次所需的时间越长,系统延时越大同时系统的吞吐量将相对减少,当系统

.

3

总的延时超过一定的限制时,系统将变得不可使用

.

5

该文所述的设计思想已成功地用于某大型汽车制造企业的发动机镶缸套压力机床的压力数据检测系

.VB

实际运行结果表明,该文所述的基于的多线程测控系统的设计思想是可行的;整个系统对压力数据

的检测迅速准确,系统的运行情况稳定可靠;系统所生成的图形图表为实时监测和控制本生产工序的质量状

况提供了依据和手段,同时其数据可为生产线前部相关工序的工艺调整提供有效参考

.

参考文献:

1DeborahKurata.DoingobjectsinVisualBasic6M.IndianapolisSAMSPublishing1999.327348.

刘晓东,苏光大一种基于中断的多线程高速图像采集系统计算机工程与应用,

2.J5.2000811.

余华云,蔡莲红,张维基于多线程的远程数据库电话访问系统的设计与实现计算机工程,

3.J4.19991417.

DesignandRealizationofVB-BasedMulti-Thread

Real-TimeMeasurementandControlSystem

GAOChun-leiGAOXin-ling

CollegeofWaterConservancyandHydropowerEngineeringHohaiUniv.Nanjing210098China

AbstractIntroducedisthedesignandrealizationofamulti-threadbasedreal-timemeasurementandcontrolsystemfor

pressuremachinetoolsanddiscussedarethetechnicalfeaturesandprogrammingmethodsofthesystem.Asystem

frameworkispresentedbyuseoftheActiveXtechniqueinVisualBasic.Thesystemissuccessfullyusedtoalarge

automobilefactory.

KeywordsVisualBasicmulti-threadreal-timemeasurementandcontrol