4 多线程的实现
在Windows操作系统中,多线程的实现需要调用一系列的API函数,如CreateThread、ResumeThread等,比较麻烦且容易出错。使用新一代RAD开发工具C++ Builder中的TThread类,可以方便地实现多线程的编程,特别是对于系统开发语言是C的Windows系列操作系统,它具有其它编程语言无可比拟的优势。
4.1 线程的创建
在C++ Builder中虽然用TThread对象说明了线程的概念,但是TThread对象本身并不完整,需要在TThread下新建其子类,并重载Execute来使用线程对象。
在C++ Builder IDE环境下选择菜单File|New,在New栏中选中Thread Object,按OK,在弹出的对话框中输入TThread对象子类的名字CoordinateDisplyThread,自动创建了一个CoordinateDisply的TThread子类。同时在编辑器中创建了一个名为CoordinateDisplyThread单元。
4.2 线程的实现
在创建的代码中Execute()函数就是要在线程中实现的任务的代码所在处。在原Unit1.cpp代码中包含了CoordinateDisplayThread.h文件。使用时,动态创建一个TCoordinateDisplay对象,具体执行的代码就是Execute()方法重载的代码。
由于Execute()中添加的线程运行时所需要执行的函数调用了VCL组件,而VCL对象不具有线程安全性,它们的特性和方法只能在主线程中访问,所以用Synchronize()函数将坐标显示函数进行包装。而坐标显示函数需如下声明:
void_fastcall Function().
下面以坐标显示线程即CoordinateDisplayThread的实现步骤为例,说明线程实现的具体方法。其他线程的实现需根据具体情况,进行修正。
在CoordinateDisplayThread.cpp文件中的CoordinateDisplayThread::Execute()函数里添加如下语句,实现X、Y、Z坐标显示函数调用的一致性。
首先用switch语句判断单轴运动中的哪一轴的坐标位置发生改变:

做好上述准备工作之后,需要在主单元中的适当的位置添加开始线程和挂起线程的命令。代码如下所示:

4.3 关于线程同步
线程同步在编程技术中非常重要,当一个线程在访问一个进程对象时,如果另一个线程要改变该对象,可能产生错误的结果。在本例开发应用中,利用API函数,可以直接使用临界或互斥来达到同步的目的。为了提高同步的可靠性和灵活性,同时用到了标志变量和临界机制。只需在程序中声明一个TRTLCriticalSection类型的变量Sect1,并在主线程的构造函数中进行初始化。之后在某个线程中,可以把相应的代码标记为临界部分,当在一个线程中调用EnterCriticalSection()并传递Sect1时,就设置多个数据成员,以表明临界部分进入活动状态。如果另一个线程要调用它自己的临界部分时,函数EnterCriticalSection()将发现有一个临界部分正在使用,就让第二个线程处于休眠状态,直到第一个线程退出临界部分为止。
5 结束语
本文将C++ builder多线程技术应用于开放式数控系统的软件设计中,有效的解决了线程同步问题,保证了数控软件系统的实时性要求,取得了较好的运用效果。