1 引言
WWW_PLC※JS_COM-PmLC-技.术_网
在工业控制领域,由于串行接口简单、使用方便,从而使得异步串行通信成为计算机之间极为常用的通信手段。C++ Builder 6是Borland公司推出的快速应用程序开发平台,它采用面向对象的C++作为开发语言,同时提供了良好的可视化开发环境,是目前开发Windows应用程序的强大、高效的开发平台之一。在基于Windows 2000的多任务操作平台下的控制系统中,利用C++ Builder的多线程技术实现串行通信可以增强控制程序的运行效率,保证控制的准确性和健壮性。WW.W_PLCJS_COM-PLC-技.术_网
2 C++ Builder下的多线程开发
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
多线程应用程序是包含数个同时执行的线程的应用程序,C++ Builder中的TThread提供了用于简化编写多线程应用程序的对象,大大简化了编写多线程程序的难度。这些对象通过避免瓶颈、组织程序和多道处理等方式来增强程序的功能。WWcW_PLCJS_COM-PLC-技.术_网
2.1 定义线程对象WW.W_PLCJS_COM-PLC-技.术_网
要在应用程序中使用线程对象,必须创建TThread的一个新的派生类。可从主菜单中选择File|New来创建TThread的一个派生类,在新对话框中,选择Thread Object,系统会提示为新线程对象提供类名。在提供名字之后,C++ Builder创建一个新的.cpp和头文件以实现线程。自动生成的.cpp文件中包含关于新线程的代码框架,若将线程命名为TmyThread,则.cpp文件如下所示:P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
//--------------------------------WWW_PLC※JS_COM-PmLC-技.术_网
#include WWW_PLCJS@_COM%-PLC-技.术_网
#include pragma hdrstopWWW.PLCJS.COM——可编程控制器技术门户
#include “Unit2.h”WWW.PLCJS.COM——可编程控制器技术门户
__fastcall TMyThread::TMyThread(bool CreateSuspended):Tthread(CreateSuspended)WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
{WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
}WWW.PLCJS.COM——可编程控制器技术门户
//--------------------------------WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
void __fastcall TmyThread::Execute()WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
{——可——编——程——控-制-器-技——术——门——户
//---- Place thread code here ----WWW_P※LCJS_CO※M-PLC-技-.术_网
}——可——编——程——控-制-器-技——术——门——户
//--------------------------------WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
在此段代码中,首先需要使用构造函数来初始化新线程类,一般是为线程分配缺省的优先级,并可指定线程是否在执行完成后自动释放。之后在Execute方法中编写线程函数实现任务。WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
多线程程序的编写和独立的程序不同,必须确认没有覆盖应用程序其他线程所使用的内存,同时因为线程与其他线程共享相同的进程空间,可使用共享内存在线程之间通信。可以通过使用主VCL线程、使用线程局部变量和检验其他线程发出的结束消息等方式实现线程函数编写的特殊要求。WWcW_PLCJS_COM-PLC-技.术_网
2.2 执行线程对象WWW.PLCJS.COM——可编程控制器技术门户
当定义Execute方法实现线程类后,可在应用程序中使用它来启动Execute方法的代码。要使用线程,首先创建线程类的一个实例。可以创建立即开始运行的线程实例,或创建一个处于临时中断状态的线程,只在调用Resume方法时开始。要创建一个立即开始运行的线程实例,将构造函数的CreateSuspended参数设为false。例如,下列代码创建一个线程并开始执行:TmyThread *SecondPreocess = new TmyThread(false); //create and run the thread,在完成执行之前线程可被随意开始和停止,要结束或者临时停止线程,调用他们的Terminate或者Suspend方法。需继续时,调用Resume方法。——可——编——程——控-制-器-技——术——门——户
2.3 协调线程P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
当编写线程执代码时,必须考虑到可能同步执行的其他线程的行为。特别要避免两个线程试图同时使用相同的全局对象或变量;另一方面,一个线程中代码可能会依赖其他线程所执行任务的结果。在C++ Builder中,系统均提供了相应的机制来协调线程间的行为,达到避免冲突并发挥多线程优点的目的。WWW_PL※CJS_COM-PLC-技.术_网
3 多线程方式下的串行通信
WWW_PLC※JS_COM-PmLC-技.术_网
利用C++ Builder开发串口通信软件一般有两种方法:其一是利用Windows的API函数,其二是采用微软的MSComm控件。相对于API函数的方式,MSComm控件使用简单,但可靠性差一些,另外考虑到系统的兼容性和可移植性,推荐使用Windows的API函数来开发相关的串口通信软件。除了上述两种开发方式以外,开发者还可以使用第三方软件供应商针对C++ Builder开发的专用的串行通信组件,这些组件其实已经把Windows API函数以及多线程编程封装在其中,对用户而言只需要像使用普通组件一样来使用它们。但这种方式下,开发者受制于第三方组件的应用条件和功能,不利于自己的功能扩展。WWW_P※LCJS_CO※M-PLC-技-.术_网