基于P2P的局域网多线程共享软件设计论文(共3篇)
1.基于P2P的局域网多线程共享软件设计论文 篇一
仿真机器人控制系统可以通过观众对机器人的兴趣、机器人与顾客的良好互动、播放产品广告来达到吸引顾客的目的,它与工业控制机器人相比,具有语音识别、仿真人说话、播放视频广告等功能。机器人控制软件在机器人控制系统中具有尤为重要的地位,其是安装在上位机,主要负责与下位机的数据通信,并根据得到的实时数据发出相应的命令,控制机器人的动作,并能通过外接的话筒按键实现自动状态与手动状态的切换。为了能够满足实时数据传输、及时响应用户操作的需要,将多线程编程技术应用于此机器人控制软件的实时任务中,使得应用程序能在上位机和下位机之间进行串口收发数据的同时,完成数据的处理、状态的及时切换、屏幕显示刷新等其它任务,以提高资源的利用率、程序的实时性和软件的整体性能。
1 机器人控制系统硬件介绍
此机器人要实现根据超声波、热释电实现转身跟踪,与观众握手、摆手、握手、鼓掌、说话,识别观众的语音,话筒录音,视频播放,自动与手动状态切换等功能。
根据要实现的功能,机器人控制系统的执行机构采用无刷电机、有刷电机、离合器和舵机来实现。单片机通过驱动电路来控制相应的电机,外围的传感器采用超声波、热释电、光电开关、话筒按键来实现,其中光电开关位于四肢和头部活动的每一个位置上,超声波、热释电位于机器人的左中右三个方向。外围传感器采集到的触发信号传送到单片机内部转换为开关量信号,单片机发送设定的控制命令控制具体哪一个电机启动和电机转动的方向、速度和时间,机器人控制系统的硬件结构可设计为如图一所示。
整个机器人控制系统采用上下位机的结构,下位机采用单片机通过控制身体各部分关节的电机运转或者舵机的角度来实现机器人的动作和表情;上位机采用工业控制机并以Windows操作系统作为操作平台,配以相应的机器人控制软件[1]。下位机将光电开关信号、按键信号、超声波信号、热释电信号等各个传感信号进行调理,数据打包,组成一定的数据帧格式,通过串行通信方式送至上位机,交由机器人控制软件作进一步的分析处理,并向下位机发送控制命令。
2 机器人控制软件功能分析
上位机控制软件主要包括数据更新部分、自动状态部分、主持状态部分。数据更新部分向操作者(店员)提供一个使用便利的人机交互界面,该界面能够方便地更新机器人说话的内容、广告的内容等针对特定用户的内容以适应不同用户的需要;自动状态部分能让机器人能够按照自动状态完成与观众互动的一套动作和流程,此时机器人处于完全自动状态,需要同时完成串口通讯、视频播放、显示字幕的刷新等功能;主持状态部分是当有主持人时,可以通过主持人和机器人相互配合和观众互动,让主持人通过外围的一些按键来控制机器人。自动状态和主持状态能够在任何时候通过外部的按键相互切换,且机器人在任何时候只能执行其中一个状态。
采用层次结构图来描述系统结构图,即用一个“处理”对应一个功能的思想来进行模块的划分,可导出软件结构[2]。
如果程序采用单线程处理,那么上述各个部分中的任务就只能依次执行,这样就会大大降低系统的实时性和可靠性。如果串口数据到达的时候软件正在执行其余任务,则无法接收串口数据,将会导致串口数据堵塞,甚至丢失;而且如果任务链中的任一环节出了问题,就会导致所有任务均无法执行。而采用多线程编程技术以其避免阻塞、能同时执行多项任务、缩减运行过程与用户界面的相互影响,以及最大程度地利用处理器资源等特点能够很好地解决在单线程处理中出现的问题,大大提高程序性能[3]。
3 机器人控制软件多线程实现
3.1 系统分析与线程划分
在机器人控制系统中,串口通讯模块需要不断地检测和接收从下层读取的各开关量信号,并且上位机控制软件要发送控制命令也需要通过串口来发送,这些信号和命令是整个控制系统实现的基础,因此通讯模块设计的好坏直接影响到整个系统能否正常运行。在自动状态时也需要不断地检测通讯端口是否有数据,还要完成机器人握手、鼓掌、语音合成等功能,相应的需要把这些功能都设计成为子线程。主持状态中每按一个话筒按键都有对应的功能,如果将实现这些功能的函数都实现在主持状态程序中,会占用较多的CPU时间,势必会影响其响应时间,因而也要将这些功能分别用一个线程来管理。人机交互模块需要不断查询用户界面消息并及时响应用户的各种操作,也采用单独的线程管理。多个线程之间的关系如图三所示。多个线程之间共享资源,又存在着许多同步和互斥关系[4],例如,语音合成发声与张嘴电机需要同步进行,所以,只有精心设计多个线程之间的同步与互斥关系,才能保证多线程程序高效、正确地运行。
3.2 多线程编程技术
在MFC中,线程分为两类:工作者线程和用户界面线程[5]。工作者线程主要用于完成后台计算;用户界面线程用于接收用户的输入,处理相应的事件和消息。两者之间最大的区别就是工作者线程没有消息循环,而用户界面线程则拥有自己的消息循环,可以处理用户以及系统的消息。
3.2.1 创建线程
一个进程的主线程是由操作系统自动生成。本控制软件的主线程流程图如图四所示。
如果要让一个主线程创建额外的线程,可以调用Create Thread来完成。
HANDLE Create Thread(LPSECURITY_AT-TRIBUTES lp Thread Attributes,DWORD dw StackSize,LPTHREAD_START_ROUTINE lp Start Address,LPVOID lp Parameter,DWORD dw CreationFlags,LPDWORD lp Thread Id);
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。其中lp Thread Attributes:指向一个SECURITY_ATTRIBUTES结构的指针,该结构决定了线程的安全属性,一般置为NULL;dw Stack Size:指定了线程的栈深度,一般都设置为0;lp Start Address:表示新线程开始执行时代码所在函数的地址,即线程的起始地址,一般情况为(LPTHREAD_START_ROUTINE)Thread Func,Thread Func是线程函数名字;lp Parameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;dw Creation Flags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数Resume Thread被用;lp Thread Id:该参数返回所创建线程的ID。
如果创建成功则返回线程的句柄,否则返回NULL。
3.2.2 终止线程
如果某线程调用了Exit Thread函数,就可以终止自己:
VOID Exit Thread(UINT fu Exit Code);
这个函数为调用该函数的线程设置了退出码fu Exit Code后,就终止该线程。
调用Terminate Thread函数亦可终止线程:
BOOL Terminate Thread(HANDL E h Thread,DWORD dw Exit Code);
该函数用来结束由h Thread参数指定的线程,并把dw Exit Code设成该线程的退出码。当某个线程不再响应时,可用其他线程调用该函数来终止这个不响应的线程。
3.2.3 数据通信
在一般情况下,一个进程中的各个线程分别独立操作,线程之间没有任何关系。但是在实际的多线程任务中,程序的各线程之间不发生任何联系显然是不可能的,如资源的共享、数据的传递等[6]。为了同一线程在不同的时刻访问共享的资源,以及不同线程同时访问同一共享资源,这就必须对访问同一共享资源的线程进行同步、调度,以避免线程之间出现资源竞争而引起几个线程乃至整个系统的死锁。Win API提供了多种同步控制对象来解决共享的访问冲突,同步对象有:临界区(Critical Section)、互斥对象(Mutex)、信号量(Semaphore)和时间(Event)。
4 结束语
本系统采用面向对象的程序设计思想,以VC6.0为开发平台,将多线程技术引入到机器人控制系统的应用程序设计中,提高了软件执行的效率和合理安排了功能的划分,在实现过程中也证明了这一点。本系统基本建立了一个机器人控制系统,但还有很多功能未能实现,这也是接下来需要完善的工作。
参考文献
[1]Kate Gregory.前导工作室译.Visual C++6开发使用手册[M].北京:机械工业出版社,1999.
[2]潘锦平,等.软件系统开发技术[M].西安:西安电子科技出版社,2001.
[3]乔林,杨志刚.Visual C++6.0高级编程技术—MFC与多线程[M].北京:中国铁道出版社,2000.
[4]张卫钢,陈文斌.用VC++实现多线程方式下的串口通信[J].长安大学学报(自然科学版),2003,(5):101-103.
[5]程昌品,张愉荣.VC实现Windows操作系统下多线程的调度与应用[J].计算机应用与软件,2004,(12):118-120.
2.基于P2P的局域网多线程共享软件设计论文 篇二
日常技术设备巡检维护工作中, 我们通常借助KVM切换器或者Dame Ware等软件, 远程连接到服务器, 并对服务器上面部署的软件运行情况及服务器运行情况等进行查看。这种做法需要耗费一定的人力投入, 而且考虑到服务器数量众多, 技术巡检人员通过远程登录方式完成所有服务器设备的巡检需要花费较多时间, 工作效率不高。基于此, 我们考虑开发设计一个服务器巡检平台。
2 功能需求分析
我们开发此平台的目的是让服务器设备巡检人员在不需要远程登录每个服务器的情况下便可完成集群服务器的基本巡检工作, 以提高巡检效率。平台包含两部分, 一是服务器数据采集端 (简称服务器端) , 二是管理控制各个服务器端的管理控制端。
服务器设备巡检主要包括查看服务器CPU使用情况、服务器内存使用情况、服务器磁盘容量使用情况以及运行在服务器上各软件进程的运行状态等。这些数据的采集由服务器端完成。
服务器端部署在各台服务器上, 负责接收管理控制端发送过来的采集指令, 完成相关数据的采集, 并将采集到的数据回传给管理控制端。
管理控制端只需部署在一台服务器上, 负责给集群服务器端发送采集指令, 并接收服务器端回传的数据, 所有服务器端均由一个管理控制端管理控制。
此外, 平台还支持远程服务器软件关闭、重启及远程服务器重启等功能, 方便在发现软件或服务器需要重启时进行重启。同时, 平台可以对服务器桌面进行截屏并上传到指定服务器上, 便于直观观察服务器运行情况。
3 平台的设计
平台设计架构图, 如图1所示。
3.1 多线程技术
线程是被系统独立调度和分派的基本单位, 它自己基本上不拥有系统资源, 而是与同属一个进程的其他线程共享进程所拥有的全部资源。Java语言支持多线程, 线程表现为Thread类。使用多线程可以同时执行多个任务, 而多个任务由一个主线程进行控制, 包括线程的开启、运行、睡眠、停止等。
服务器巡检平台中, 管理控制端和服务器采集端都有使用多线程技术。
(1) 线程池技术在管理控制端的应用
管理控制端程序的实现采用的是多线程中的线程池技术。为保证管理控制端管理多个服务器端, 我们在线程池中首先初始化N个线程, 并启动就绪, 其中每个线程负责与一个服务器端进行数据交换, 且各线程相互之间不干扰。这种情况下多线程不是多任务并行执行的, 而是通过多个线程控制多个不同的服务器, 方便管理。我们采用多线程是为了方便与各台服务器的通信和对服务器的控制。当我们只需要查看某台服务器的状态时, 只需切换到负责与该台服务器通信的线程即可。当然, 此处也可以不使用多线程, 把所有代码都写在一个线程里, 但是这种方法可能会使代码维护工作不方便, 尤其是一个线程里维护多个socket连接。
(2) 多任务并行执行技术在服务器端的应用
服务器端程序的实现采用的是多线程中的多任务并行执行技术。为保证一个服务器端采集程序可以被多个管理控制端程序同时连接, 服务器端程序在socket端口一直保持监听, 当有新的请求时便开启一个新的线程进行服务。服务器端使用多线程并行技术是必要的, 这样保证了一个服务器端程序可以被多个管理控制端连接, 便于多个维护人员使用。
3.2 C/S网络通讯过程的建立
平台管理控制端与服务器端采用网络插口 (socket) 通信模式进行通信。服务器端担当服务器 (Server) 角色, 对管理控制端发送的请求进行处理回传, 管理控制端接收回传数据。两者构成C-S网络通信架构。
C/S网络通信过程如图2所示。
3.3 管理控制端的设计
3.3.1 管理控制端多服务器采集任务调度
管理控制端通过多线程技术中的线程池技术实现与多个服务器端采集程序的通信。这种情况下多线程并不是指管理控制端可以同时执行多个任务, 而是通过开启多个线程, 让每一个线程单独负责与一个服务器端采集程序的数据交换, 当我们需要采集某一台服务器的数据时, 只需要通过命令控制切换到负责与该台服务器通信的线程。
实际采集工作中, 各个线程来回切换以满足不同服务器的采集任务。我们使用给线程设置标志位的方法实现不同服务器采集任务之间的切换。具体任务切换设计方法如下:管理控制端启动时所有线程启动并进入就绪状态, 同时设置所有线程标志位为false;当控制各个线程的主程序接收到采集服务器A数据的命令时, 负责与该服务器通信的线程A被激活, A线程标志位设置为true, 此时程序进入到线程A执行, 当线程A接收到结束采集命令时, 线程A标志位设置为false, 此时程序进行主线程执行, 等待切换到另一台服务器进行数据采集。
采集任务切换, 主程序启动后监听输入, 输入“t1”后负责与t1服务器通信的线程池中的线程进入执行状态, 等待接收采集指令, 输入“quit”指令, 该线程进入阻塞状态, 程序进入主程序执行, 等待下一个要采集的服务器代号 (t2, t3……) 。
3.3.2 管理控制端与服务器端指令约定
管理控制端与服务器端采集程序建立socket连接之后, 需要向服务器端采集程序发送指令, 服务器端根据发送的指令进行相关数据采集和回传。因此, 管理控制端和服务器端需要建立指令识别约定。
对于服务器数据采集工作, 我们需要进行的主要操作有:采集服务器cpu使用率、内存使用量、磁盘使用量, 服务器上运行进程的状态、进程关闭、进程开启, 服务器重启、桌面截屏。
3.3.3 管理控制端向服务端发送指令和接收数据
设计过程:建立与服务器端的socket连接;定义输出流用来向服务器端程序发送指令, 定义输入流用来读取服务器端程序回传的采集数据;定义无穷循环, 持续向服务器端发送指令和读取数据, 在遇到“quit”字符串时结束循环;关闭socket连接。
3.4 服务器端的设计
3.4.1 接收管理控制端发送的指令和数据回传
设计过程:建立socket端口监听管理控制端连接, 当监听到有新的管理控制端与该服务器端连接时, 服务器端启动一个新的线程处理与该管理控制端的通信;定义输入流用来读取管理控制端程序发送的采集指令, 定义输出流用来向管理控制端回传采集数据;定义无穷循环, 持续接收管理控制端发送的采集指令, 在遇到“quit”字符串时结束循环;关闭socket连接。
3.4.2 服务器数据采集
服务器数据采集包含服务器CPU使用情况、内存使用情况、磁盘容量使用情况以及服务器上各进程的运行情况等。我们使用Java自带API或者引入的sigar.jar包编程进行数据的采集。此外, 我们还实现了对服务器进行截屏的功能, 方便直观观察服务器的运行情况。
(1) CPU使用率采集
服务器端程序接收到管理控制端发送的CPU指令后, 调用CPU使用率采集函数获取使用率。具体实现过程如下:构造采集进程命令串, 执行命令串读取CPU, 程序休眠, 执行命令串读取CPU, 根据两次结果换算出CPU使用率。
(2) 内存使用情况采集
服务器端程序接收到管理控制端发送的Mem指令后, 调用内存使用情况函数获取内存使用情况。具体实现过程如下:构造数组列表结构并建立sigar类, 调用sigar类的getMem () 获得Mem类, 调用Mem类中的方法获取内存使用情况。
(3) 磁盘容量使用情况采集
服务器端程序接收到管理控制端发送的disk指令后, 调用磁盘容量使用情况函数获取磁盘容量使用情况。具体实现过程如下:构造数组列表;循环A到Z盘, 根据字母顺序创建文件;如果A到Z盘对应的文件已经存在, 则调用相关函数获得磁盘使用量。这种实现过程针对Windows系统。
(4) 服务器数据采集回传功能展示
“t2”切换到服务器t2数据采集进程, 依次采集CPU使用率、内存使用情况、磁盘使用情况。
(5) 服务器上相关进程的操作
服务器上相关进程的操作包括进程状态的查看、关闭进程、开启进程及关机重启等。
(6) 服务器桌面截屏
对服务器桌面进行截屏并发送到指定的服务器上, 可以方便技术巡检人员查看服务器的运行概况。管理控制端向服务器端发送snap指令, snap指令调用拍照函数对服务器桌面截屏, 并将图片通过网络发送到指定服务器。屏幕截屏实质就是对屏幕进行拍照。
4 结束语
3.基于P2P的局域网多线程共享软件设计论文 篇三
1 多线程技术概述
多线程在Windows编程中是一个比较重要的概念。所谓多线程,即在同一个程序中可以同时执行多个任务。这意味着,编程者可以将整个任务分成几个线程,然后让操作系统同时执行,从而提高程序的执行效率。一般线程被分为两种:用户界面线程和工作线程(又称为后台线程)。
1.1 创建线程与终止线程
创建线程的过程可以分成两大步骤,首先编写线程函数,然后创建线程,并将其参数线程函数地址指向刚刚编写的线程函数。线程函数的退出,除了使用退出函数处理外,大都是随着程序的结束而退出。
1.2 线程同步
多线程提高了程序执行的效率,提高了编程的灵活性,但同时也引入了新的问题。线程之间经常要同时访问一些资源,因此对共享资源进行访问引起冲突是不可避免的。另外,在Windwos的消息驱动方式下,必须某个事件的发生了,才可以执行某个线程,为了解决上述问题,必须引入线程同步的概念。Win32 API提供了多种同步控制对象,包括临界区、互斥对象、信号量和事件。
2 多线程间通信
一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的。多线程间通信可以采用全局变量、自定义消息、事件对象通信。
1)使用全局变量进行通信
由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,可以使用volatile修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。如果线程间所需传递的信息较复杂,可以定义一个结构,通过传递指向该结构的指针进行传递信息。
2)使用自定义消息进行通信
可以在一个线程的执行函数中向另一个线程发送自定义的消息来达到通信的目的。一个线程向另外一个线程发送消息是通过操作系统实现的。利用Windows操作系统的消息驱动机制,当一个线程发出一条消息时,操作系统首先接收到该消息,然后把该消息转发给目标线程,接收消息的线程必须已经建立了消息循环。
3)使用事件对象进行通信
在线程之间传送信号的一种比较复杂的方法是使用享件对象,在MFC中有一个事件类CEvent。一个事件对象可以处于两种状态的一种:信号态和非信号态。线程能够监视处于信号态的事件,以便在适当的时间执行对事件的操作。
3 多线程通信程序设计
3.1 重要函数
1)Win32 API对多线程编程的支持
Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。
(1)HANDLE Create Thread(LPSECURITY_ATTRIBUTES lp Thread Attributes,DWORD dw Stack Size,LPTHREAD_START_ROUTINElp Start Address,LPVOID lp Parameter,DWORD dw Creation Flags,LPDWORD lp Thread Id);
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,如果创建成功则返回线程的句柄,否则返回NULL。
(2)DWORD Suspend Thread(HANDLE h Thread);
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
(3)DWORD Resume Thread(HANDLE h Thread);
该函数用于结束线程的挂起状态,执行线程。
(4)VOID Exit Thread(DWORD dw Exit Code);
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dw Exit Code用来设置线程的退出码。
(5)BOOL Terminate Thread(HANDLE h Thread,DWORD dw Exit Code);
一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用Terminate Thread强行终止某一线程的执行。使用Terminate Thread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。
(6)BOOL Post Thread Message(DWORD id Thread,UINT Msg,WPARAM w Param,LPARAM l Param);
该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。
2)MFC对多线程编程的支持
MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。
工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。
在MFC中,一般用全局函数Afx Begin Thread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。两种重载函数原型和参数分别说明如下:
(1)CWin Thread*Afx Begin Thread(AFX_THREADPROC pfn Thread Proc,LPVOID p Param,
n Priority=THREAD_PRIORITY_NORMAL,UINT n Stack Size=0,
DWORD dw Create Flags=0,LPSECURITY_ATTRIBUTES lp Security Attrs=NULL);
(2)CWin Thread*Afx Begin Thread(CRuntime Class*p Thread Class,
int n Priority=THREAD_PRIORITY_NORMAL,UINT n Stack Size=0,
DWORD dw Create Flags=0,LPSECURITY_ATTRIBUTES lp Security Attrs=NULL);
一般情况下,调用Afx Begin Thread()来一次性地创建并启动一个线程,但是也可以通过两步法来创建线程:首先创建CWin Thread类的一个对象,然后调用该对象的成员函数Create Thread()来启动该线程。
(3)virtual BOOL CWin Thread::Init Instance();
重载该函数以控制用户界面线程实例的初始化。初始化成功则返回非0值,否则返回0。用户界面线程经常重载该函数,工作者线程一般不使用Init Instance()。
(4)virtual int CWin Thread::Exit Instance();
在线程终结前重载该函数进行一些必要的清理工作。该函数返回线程的退出码,0表示执行成功,非0值用来标识各种错误。同Init Instance()成员函数一样,该函数也只适用于用户界面线程。
3.2 VC++下多线程局域网聊天程序
聊天程序是现代生活中不可缺少的通信工具,为了在局域网中实现点对点的实时通信,在VC++的编程环境中,利用套接字库技术和多线程编程技术实现聊天程序。
1)界面设计。界面设计如图1所示。
2)函数
void CMy QQDlg::Send Msg()//发送消息
void CMy QQDlg::Send File()//发送文件
void CMy QQDlg::Caputer()//抓取屏幕
void CMy QQDlg::Add Msg List(CString IP,CString str)//添加信息于LISTBOX控件中
CString CMy QQDlg::Get Error(DWORD error)//返回错误信息
int CMy QQDlg::Get Local Host Name(CString&s Host Name)//获得本地计算机名称
int CMy QQDlg::Get Ip Address(const CString&s Host Name,CString&s Ip Address)//获得本地IP
int CMy QQDlg::Get Nameby Address(const CString&Ip Address,CString&s You Name)//获得对方计算机名称
3)线程启动
p Thread Lisen=::Afx Begin Thread(_Listen Tcp Thread,this);//开始TCP线程
p Thread Lisen=::Afx Begin Thread(_UDPThread,this);//开始UDP线程
4)服务器线程
UINT_Listen Tcp Thread(LPVOID lparam)//TCP监听线程
UINT_UDPThread(LPVOID lparam)//UDP接受信息线程开始
5)客户端线程
UINT_Send File Thread(LPVOID lparam)//发送文件线程
UINT_Send Msg Thread(LPVOID lparam)//TCP发送信息线程
UINT_Send Msg Udp Thread(LPVOID lparam)//UDP发送信息
UINT_Thread Capture(LPVOID lparam)//抓取对方屏幕线程
以上程序在Windows XP,Microsoft Visual C++6.0中编译执行通过。
4 结束语
要设计出性能较好的多线程通信程序,不仅需要对操作系统的处理过程很清楚,还需要对VC++的线程处理函数十分了解,并对具体应用中各线程的关系非常清楚,以利于在应用程序中控制同步事件的发生,避免出现死锁或不能同步处理的现象。
参考文献
[1]孙鑫,余安萍.VC++深入详解(附光盘)[M].北京:电子工业出版社,2006.
[2]孔鹏.Visual C++6.0完全自学手册(附光盘)[M].北京:机械工业出版社,2007.
[3]赵仕建.VISUAL C++6.0编程与实例解析[M].北京:科学出版社,2000.
【基于P2P的局域网多线程共享软件设计论文】推荐阅读:
基于组态软件的电动汽车CAN总线网络设计08-18
基于3G网络的移动P2P视频直播技术研究10-03
局域网技术与设计分析06-18
浅谈基于移动搜索的网页设计优化研究论文08-16
基于自动售货机的软件工程07-10
基于matlab的连杆机构设计10-30
基于CAD技术的汽车设计实例06-17
基于课程标准下的课时教学设计07-17