基于TCPIP的多线程通信及其在远程监控系统中的应用.docx_第1页
基于TCPIP的多线程通信及其在远程监控系统中的应用.docx_第2页
基于TCPIP的多线程通信及其在远程监控系统中的应用.docx_第3页
基于TCPIP的多线程通信及其在远程监控系统中的应用.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于TCP/IP的多线程通信及其在远程监控系统中的应用文章出处:上海交通大学自动化研究所(200030)王金廉 谢剑英 贾 发布时间: 2007/09/25 | 1280 次阅读 | 1次推荐 |0条留言业界领先的TEMPO评估服务每天新产品 时刻新体验IC分销商如何选择管理软件摘 要: 提出了一种在Windows NT下基于TCP/IP协议的多线程通信的设计与实现方法,在此基础上给出了多线程通信在蓄电池远程监控系统中的应用实例。关键词: 多线程 实时性 TCP/IP协议 远程监控系统 传统的应用程序都是单线程的,即在程序运行期间,由单个线程独占CPU的控制权,负责执行所有任务。在这种情况下,程序在执行一些比较费时的任务时,就无法及时响应用户的操作,影响了应用程序的实时性能。在监控系统,特别是远程监控系统中,应用程序往往不但要及时把监控对象的最新信息反馈给监视客户(通过图形显示),还要处理本地机与远程机之间的通信以及对控制对象的实时控制等任务,这时 ,仅仅由单个线程来完成所有任务,显然无法满足监控系统的实时性要求。在DOS系统下,这些工作可以由中断来完成。而在Windows NT下,中断机制对用户是不透明的。为此,可引进多线程机制,主线程专门负责消息的响应,使程序能够响应命令和其他事件。辅助线程可以用于完成其他比较费时的工作,如通信、图形显示和后台打印等,这样就不至于影响主线程的运行。 Windows NT 多线程概述 Windows NT是一个真正的抢占式多任务操作系统。在 Windows NT中,启动一个应用程序就是启动该应用程序的一个实例,即进程。进程由一个或多个线程构成,拥有内存和资源,但自己不能执行自己,而是进程中的线程被调度执行。进程至少要有一个线程,当创建一个进程时,就创建了一个线程,即主线程。主线程可以创建其他辅助线程,由主线程创建的线程又可创建线程。每个线程都可指定优先级,操作系统根据线程的优先级调度线程的执行。 Windows NT中使用多线程的方法有三种: 使用C多线程库函数; 使用CreateThread() 等Win32函数; 使用MFC类。 本文采用第三种方法。在Visual C+5.0 中,MFC应用程序用CWinThread 对象表示线程。基本操作如下: 创建新线程:调用MFC全局函数AfxBeginThread ()创建新线程。AfxBeginThread()启动新线程并返回控制,然后,新线程和调用AfxBeginThread()的线程同时运行。它的返回值为指向CWinThread对象的指针; 暂停恢复线程:调用CWinThread类成员函数SuspendThread()暂停线程的运行,调用ResumeThread()成员函数恢复线程的运行; 终止线程:在线程内部可调用全局函数AfxBeginThread()终止线程的运行,否则,线程执行结束后,线程自动从线程函数返回并释放线程占有的资源。 基于TCP/IP的多线程编程 TCP/IP是lnternet上广泛使用的一种协议,可用于异种机之间的互联。TCP/IP协议本身是非常复杂的,然而在网络编程中,程序员不必考虑TCP/IP的实现细节,只需利用协议的网络编程接口SOCKET.htm target=_blank title=Socket货源和PDF资料Socket(亦称套接字)即可。在 Windows 中,网络编程接口是 Windows SOCKET.htm target=_blank title=Socket货源和PDF资料Socket它包含标准的Berkley SOCKET.htm target=_blank title=Socket货源和PDF资料Sockets的功能调用的集合,以及为 Windows 所做的一些扩展。TCP/IP协议的应用一般采用客户服务器模式,面向连接的应用调用如图所示。 根据上述顺序调用函数建立连接后,通信双方便可交换数据1。然而,在调用带*号的函数时,操作常会阻塞,特别是当套接字工作在同步阻塞模式(Blocking Mode)时。这时,程序无法响应任何消息。为了避免出现这种情况,本文引进辅助线程。在执行含有可能阻塞的函数的任务时,动态创建新的线程,专门处理该任务。主线程把任务交给辅助线程后,不再对辅助线程加以控制与调度。本文分别针对connect()、accept()、receive()、send()等可能阻塞的函数创建了相应的线程,如表1所示。 多线程编程常常还要考虑线程间的通信。线程间的通信可以采用全局变量、指针参数和文件映射等方式。本文采用指针参数方式。在调用AfxBeginThread()函数时,通过传递指针参数的方式在主线程与辅助线程间通信。 AfxBeginThread()函数的用法如下: CWinThread*AfxBeginThread (AFXTHREADPROC pfnThreadproc, LPVOID pParam, int nPriority=THREADPRIORITYNORMAL, UINT nStackSixe=0, DWORD dwCreateFlags=0, LPSECURITYATTRIBUTES lpSecurityAttrs=NULL); 参数pfnThreadProc指定线程函数必须如下定义: UINT MyControllingFunction(LPVOID pParam); 参数pParam 是调用线程传递给线程函数pfThreadProc的参数; 其他参数一般只需采用缺省值。 指针参数通信方式就是通过参数pParam在线程间通信的,它可为指向任何数据类型的指针。本文中,定义了一个名叫EXCHANGEINFO的结构如下: typedef struct SOCKET sServerSOCKET.htm target=_blank title=Socket货源和PDF资料Socket; SOCKET *pcCoientSOCKET.htm target=_blank title=Socket货源和PDF资料Socket; SOCKADDRIN *pClientAddr; BOOL *pbConnected; unsigned char *pucBuffer; int *pnMessageLen; EXCHANGEINFO; 在需要通信时,先声明一个结构变量,再把变量的指针作为pParam参数,调用AfxBeginThread(AFXTHREADPROC) CSOCKET.htm target=_blank title=Socket货源和PDF资料SocketThread:WaitFor ConnectThread,(LPVOID) mExchangeinfo)函数即可。 为了利用面向对象技术编程所具有的模块性强、便于修改、可移植性好等优点,本文还把表1中的线程封装为父类为CWinThread的自定义类CSOCKET.htm target=_blank title=Socket货源和PDF资料SocketThread中。还自定义了一个叫CSOCKET.htm target=_blank title=Socket货源和PDF资料SocketComm的新类,封装了一些函数,如CreateSOCKET.htm target=_blank title=Socket货源和PDF资料Socket、ConnectToServer、WaitForClient、ReadMessage、SendMessage等,这些函数屏蔽了面向连接的通信程序的实现细节,如创建、连接、发送和接收等,在这些函数里,动态创建辅助线程。 下面以CSOCKET.htm target=_blank title=Socket货源和PDF资料SocketComm类中的等待客户连接请求的函数WaitForClient()为例,注释说明多线程编程的具体细节。 BOOL CSOCKET.htm target=_blank title=Socket货源和PDF资料SocketComm:WaitForClient if(mbConnected)return( TRUE ); 配置bind函数的参数即服务器的套接字地址结构SOCKADDRIN Addr; memset(Addr,0,sizeof(SOCKADDRIN); Addrsinfamily=AFINET; ADDRSINport= htonl(mnPort); Addrsinaddrsaddr = htonl(INADDRANY); 将套接字地址结构赋予套接字(绑定),以指定本地半相关 int nReturnValue; nReturnValue =:bind( msSserverSOCKET.htm target=_blank title=Socket货源和PDF资料Socket,( LPSOCKADDR)Addr,sizeof (SOCKADDRIN ); if(nReturnValue = SOCKETERROR) returu( FALSE ); 配置传给WaitForConnectThread线程函数的参数mExchangeinfo mExchangeinfosServerSOCKET.htm target=_blank title=Socket货源和PDF资料Socket = msserverSOCKET.htm target=_blank title=Socket货源和PDF资料Socket; mExchangeinfopsClientSOCKET.htm target=_blank title=Socket货源和PDF资料Socket = msClientSOCKET.htm target=_blank title=Socket货源和PDF资料Socket; mExchangeinfopClientAddr = mClientAddr; mExchangeinfopbConnected = mbConnected;以mExchangeinfo的指针为参数调用WaitforConnectThread线程等待客户端连接 AfxBeginThread(AFXTHREADPROC)CSOCKET.htm target=_blank title=Socket货源和PDF资料SocketThread: WaitForConnectThread,(LPVOID) mExchanginfo); returi( TRUE ) 等待连接线程UINT CSOCKET.htm target=_blank title=Socket货源和PDF资料SocketThread:WaitForConnectThread(LPVOIDpParam) EXCHANGEINFO*pExchangelnfo(EXCHANGEINFO*) pParam;int nReturnValue, nClientAddrSize= Sizeof( SOCKADDRIN); 侦听连接 nReturnValue=: listen(pExchangelnfo sServerSOCKET.htm target=_blank title=Socket货源和PDF资料Socket, 1); if( nReturnValue = SOCKETERROR )return(0); 阻塞调用accept,直至有客户连接请求 *pExchangelnfopsClitentSOCKET.htm target=_blank title=Socket货源和PDF资料Socket=: accept(pExchangelnfosServerSOCKET.htm target=_blank title=Socket货源和PDF资料Socket, (LPSOCKADDR) pEchangelnfo pClientAddr,nClientAddrSize); if( *pExchangelnfopsClitentSOCKET.htm target=_blank title=Socket货源和PDF资料Socket)!= INVALIDSOCKET) 通过pExchangelnfo的指针在线程间通信 * pExchangelnfopbConnected TRUE; return( 0 ); 应用实例高层协议的设计 在电厂和电站中,为了保证安全工作,保护系统必不可少。保护系统的电源供应通常使用两种方式。一般情况下,使用交流电系统对保护系统进行供电;当交流电系统出现故障时立即使用后备的蓄电池系统对保护系统进行供电。为了对蓄电池系统进行监控和管理,以保证蓄电池在关键时刻能正常工作,设计了在Windows NT环境下具有远程通讯功能和动态人机界面的智能蓄电池远程监控系统 。该系统由蓄电池智能管理、充电机控制、母线绝缘在线检测、声光报警、系统组态、远程通信等子系统组成,实现对蓄电池充电机智能化远程管理和控制,对整个系统的运行状态进行实时监控,具有多媒体报警、事件处理、动态数据库、趋势画面和动态画面显示、操作提前提醒等功能。系统框图如图2所示。在远程通信模块中,远程监控机需把监控客户的操作命令及时传给本地机,本地机根据命令控制充电机,使之按照一定的方式工作,而本地机需定时向远程监控机反馈实时的充电机状态信息。它们之间的通信是基于TCP/IP的广域网通信,而且,我们引进了多线程机制以保证系统具有良好的实时性。 下面以其中的充电机控制系统为例谈谈如何使用CSOCKET.htm target=_blank title=Socket货源和PDF资料SocketComm类进行远程通信。为简单起见,假定本地机与远程监控机之间通信的信息仅有下面三种类型: 本地机接收到该命令后,控制充电机按照稳压模式运行,输出电压为电压给定值; 本地机接收到该命令后,控制充电机按照稳流定时模式运行,输出电流为电流给定值; 本地机向远程监控机发送充电机的实时状态数据(包括输出电压、输出电流、状态指示和故障类型指示)。 在基于TCP/IP的面向连接的网络通信中,客户与服务器之间传送的是有序可靠的字节流(Byte Stream),所

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论