作者:上海交通大学自动化研究所(200030)王金廉
谢剑英 贾 青来源:《电子技术应用》
基于tcp/ip的多线程通信及其在
远程监控系统中的应用
摘 要: 提出了一种在windows
nt下基于tcp/ip协议的多线程通信的设计与实现方法,在此基础上给出了多线程通信在蓄电池远程监控系统中的应用实例。
关键词: 多线程 实时性 tcp/ip协议
远程监控系统
传统的应用程序都是单线程的,即在程序运行期间,由单个线程独占cpu的控制权,负责执行所有任务。在这种情况下,程序在执行一些比较费时的任务时,就无法及时响应用户的操作,影响了应用程序的实时性能。在监控系统,特别是远程监控系统中,应用程序往往不但要及时把监控对象的最新信息反馈给监视客户(通过图形显示),还要处理本地机与远程机之间的通信以及对控制对象的实时控制等任务,这时
,仅仅由单个线程来完成所有任务,显然无法满足监控系统的实时性要求。在dos系统下,这些工作可以由中断来完成。而在windows
nt下,中断机制对用户是不透明的。为此,可引进多线程机制,主线程专门负责消息的响应,使程序能够响应命令和其他事件。辅助线程可以用于完成其他比较费时的工作,如通信、图形显示和后台打印等,这样就不至于影响主线程的运行。
1 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()终止线程的运行,否则,线程执行结束后,线程自动从线程函数返回并释放线程占有的资源。
2 基于tcp/ip的多线程编程
tcp/ip是lnternet上广泛使用的一种协议,可用于异种机之间的互联。tcp/ip协议本身是非常复杂的,然而在网络编程中,程序员不必考虑tcp/ip的实现细节,只需利用协议的网络编程接口socket(亦称套接字)即可。在
windows 中,网络编程接口是 windows socket它包含标准的berkley
sockets的功能调用的集合,以及为 windows 所做的一些扩展。tcp/ip协议的应用一般采用客户/服务器模式,面向连接的应用调用如图1所示。
根据上述顺序调用函数建立连接后,通信双方便可交换数据[1]。然而,在调用带*号的函数时,操作常会阻塞,特别是当套接字工作在同步阻塞模式(blocking
mode)时。这时,程序无法响应任何消息。为了避免出现这种情况,本文引进辅助线程。在执行含有可能阻塞的函数的任务时,动态创建新的线程,专门处理该任务。主线程把任务交给辅助线程后,不再对辅助线程加以控制与调度。本文分别针对connect()、accept()、receive()、send()等可能阻塞的函数创建了相应的线程,如表1所示。
作者:上海交通大学自动化研究所(200030)王金廉
谢剑英 贾 青来源:《电子技术应用》
基于tcp/ip的多线程通信及其在
远程监控系统中的应用
摘 要: 提出了一种在windows
nt下基于tcp/ip协议的多线程通信的设计与实现方法,在此基础上给出了多线程通信在蓄电池远程监控系统中的应用实例。
关键词: 多线程 实时性 tcp/ip协议
远程监控系统
传统的应用程序都是单线程的,即在程序运行期间,由单个线程独占cpu的控制权,负责执行所有任务。在这种情况下,程序在执行一些比较费时的任务时,就无法及时响应用户的操作,影响了应用程序的实时性能。在监控系统,特别是远程监控系统中,应用程序往往不但要及时把监控对象的最新信息反馈给监视客户(通过图形显示),还要处理本地机与远程机之间的通信以及对控制对象的实时控制等任务,这时
,仅仅由单个线程来完成所有任务,显然无法满足监控系统的实时性要求。在dos系统下,这些工作可以由中断来完成。而在windows
nt下,中断机制对用户是不透明的。为此,可引进多线程机制,主线程专门负责消息的响应,使程序能够响应命令和其他事件。辅助线程可以用于完成其他比较费时的工作,如通信、图形显示和后台打印等,这样就不至于影响主线程的运行。
1 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()终止线程的运行,否则,线程执行结束后,线程自动从线程函数返回并释放线程占有的资源。
2 基于tcp/ip的多线程编程
tcp/ip是lnternet上广泛使用的一种协议,可用于异种机之间的互联。tcp/ip协议本身是非常复杂的,然而在网络编程中,程序员不必考虑tcp/ip的实现细节,只需利用协议的网络编程接口socket(亦称套接字)即可。在
windows 中,网络编程接口是 windows socket它包含标准的berkley
sockets的功能调用的集合,以及为 windows 所做的一些扩展。tcp/ip协议的应用一般采用客户/服务器模式,面向连接的应用调用如图1所示。
根据上述顺序调用函数建立连接后,通信双方便可交换数据[1]。然而,在调用带*号的函数时,操作常会阻塞,特别是当套接字工作在同步阻塞模式(blocking
mode)时。这时,程序无法响应任何消息。为了避免出现这种情况,本文引进辅助线程。在执行含有可能阻塞的函数的任务时,动态创建新的线程,专门处理该任务。主线程把任务交给辅助线程后,不再对辅助线程加以控制与调度。本文分别针对connect()、accept()、receive()、send()等可能阻塞的函数创建了相应的线程,如表1所示。
-->
热门点击
推荐技术资料