网络编程实用教程第7-8章-多线程编程.ppt

上传人:wuy****n92 文档编号:80517255 上传时间:2023-03-23 格式:PPT 页数:62 大小:203KB
返回 下载 相关 举报
网络编程实用教程第7-8章-多线程编程.ppt_第1页
第1页 / 共62页
网络编程实用教程第7-8章-多线程编程.ppt_第2页
第2页 / 共62页
点击查看更多>>
资源描述

《网络编程实用教程第7-8章-多线程编程.ppt》由会员分享,可在线阅读,更多相关《网络编程实用教程第7-8章-多线程编程.ppt(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、网络编程实用教程网络编程实用教程第第7章章WinSock的多线程编程的多线程编程本章内容:本章内容:uWinSock需要多线程编程的原因:需要多线程编程的原因:uWin32操作系统下的多进程多线程机制、多线程操作系统下的多进程多线程机制、多线程机制在网络编程中的应用和机制在网络编程中的应用和VisualC+6.0对多线对多线程网络编程的支持。程网络编程的支持。u分析了分析了 MFC MFC 支持的两种线程,给出了创建支持的两种线程,给出了创建MFCMFC的的工作线程、创建并启动用户界面线程和终止线程工作线程、创建并启动用户界面线程和终止线程的步骤。的步骤。7.1WinSock为什么需要多线程编

2、程为什么需要多线程编程7.1.1WinSock的两种输入输出模式的两种输入输出模式 如前所述,如前所述,WinSockWinSock在进行输入输出的时候,可以在进行输入输出的时候,可以使用两种工作模式使用两种工作模式 :u“阻塞阻塞”模式:又称为模式:又称为同步模式同步模式u“非阻塞非阻塞”模式模式:又称为又称为异步模式异步模式 工作在工作在“阻塞阻塞”模式下的套接字被称为模式下的套接字被称为阻塞套接阻塞套接字字,而工作在,而工作在“非阻塞非阻塞”模式下的套接字称为模式下的套接字称为非阻塞非阻塞套接字套接字。7.1.2两种模式的优缺点及解决方法两种模式的优缺点及解决方法“阻塞阻塞”与与“非阻塞

3、非阻塞”模式的优点和缺点:模式的优点和缺点:u阻塞套接字的阻塞套接字的I/OI/O操作工作情况比较确定,即调操作工作情况比较确定,即调用、等待、返回。大部分情况下,用、等待、返回。大部分情况下,I/OI/O操作都能操作都能成功地完成,只是花费了等待的时间,成功地完成,只是花费了等待的时间,容易编程容易编程;u需要建立多个套接字连接来为多个客户服务的时需要建立多个套接字连接来为多个客户服务的时候,或在数据的收发量不均匀的时候,或在输入候,或在数据的收发量不均匀的时候,或在输入输出的时间不确定的时候,阻塞套接字的性能低输出的时间不确定的时候,阻塞套接字的性能低下,甚至无能为力。下,甚至无能为力。u

4、使用非阻塞套接字,需要编写更多的代码,因为使用非阻塞套接字,需要编写更多的代码,因为必须恰当地把握调用必须恰当地把握调用I/OI/O函数的时机,尽量减少无函数的时机,尽量减少无功而返的调用,还必须详加分析每个功而返的调用,还必须详加分析每个WinsockWinsock调用调用中收到的错误,采取相应的对策,这种中收到的错误,采取相应的对策,这种I/OI/O操作的操作的随机性使得非阻塞套接字显得难于操作。随机性使得非阻塞套接字显得难于操作。所以必须采取适当的对策,让阻塞和非阻塞套接所以必须采取适当的对策,让阻塞和非阻塞套接字能够满足各种场合的要求。字能够满足各种场合的要求。u对于非阻塞工作模式:引

5、入了五种对于非阻塞工作模式:引入了五种“套接字套接字I/OI/O模模型型”。u阻塞的工作模式,则引入了阻塞的工作模式,则引入了多线程机制多线程机制。7.2Win32操作系统下的多进操作系统下的多进程多线程机制程多线程机制7.2.2Win32OS支持多线程支持多线程应用程序、进程及线程的关系应用程序、进程及线程的关系 DOS DOS是单是单用户单任务用户单任务的。的。Win32 Win32操作系统是操作系统是多任务多任务的,并且支持一个进程中的,并且支持一个进程中有有多个线程多个线程。一个线程。一个线程(thread)(thread)是进程内的一条执行是进程内的一条执行路径,是一个应用程序中的一

6、条可执行路径。路径,是一个应用程序中的一条可执行路径。一个进程中至少要有一个线程,称为一个进程中至少要有一个线程,称为主线程主线程。当启。当启动了一个应用程序时,操作系统将为它创建了一个进动了一个应用程序时,操作系统将为它创建了一个进程,同时创建该进程的主线程,并开始执行主线程。程,同时创建该进程的主线程,并开始执行主线程。主线程可以创建并启动其他辅助线程,由主线程主线程可以创建并启动其他辅助线程,由主线程创建的线程又可以创建并启动更多的线程。创建的线程又可以创建并启动更多的线程。7.2.2Win32OS支持多线程支持多线程单单CPU分时地运行进程中的各个线程分时地运行进程中的各个线程7.2.

7、3多线程机制在网络编程中的应用多线程机制在网络编程中的应用 如果一个应用程序,有多个任务需要同时进行处如果一个应用程序,有多个任务需要同时进行处理,则适合使用理,则适合使用多线程机制多线程机制。u对于网络上对于网络上客户机软件客户机软件:采用多线程,能克服在:采用多线程,能克服在单线程的编程模式下,由于阻塞等待而产生的客单线程的编程模式下,由于阻塞等待而产生的客户程序就不能及时响应用户的操作命令的问题。户程序就不能及时响应用户的操作命令的问题。u对于网络上对于网络上服务器软件服务器软件:采用多线程的编程技术,:采用多线程的编程技术,能更好地为多个客户服务。能更好地为多个客户服务。u对于对于一个

8、客户一个客户:采用多线程机制也能大大提高应:采用多线程机制也能大大提高应用程序的运行效率。用程序的运行效率。u网络在线网络在线实时监控软件实时监控软件:7.3VC6.0对多线程网络编程的支持对多线程网络编程的支持VC6.0VC6.0环境下环境下 ,两种开发程序的方法:,两种开发程序的方法:u直接使用直接使用Win32 APIWin32 API来编写来编写Win32 Win32 应用程序应用程序u利用利用MFC MFC 基础类库编写基础类库编写 C+C+风格的应用程序。风格的应用程序。在这两种在这两种WindowsWindows应用程序的开发方式下,多线程应用程序的开发方式下,多线程的编程原理是

9、一致的。的编程原理是一致的。7.3.1MFC支持的两种线程支持的两种线程 微软的基础类库微软的基础类库MFCMFC提供了对于多线程应用程序的提供了对于多线程应用程序的支持。在支持。在MFCMFC中,线程分为两种:中,线程分为两种:u用户接口线程用户接口线程:(user-interface thread)(user-interface thread),或称,或称用户界面线程;用户界面线程;u工作线程工作线程:(the worker thread)(the worker thread),这两类线程可,这两类线程可以满足不同任务的处理需求。以满足不同任务的处理需求。1、用户接口线程、用户接口线程 作

10、用:作用:用于处理用户的输入,响应用户产生的消息。用于处理用户的输入,响应用户产生的消息。MFCMFC为用户接口线程提供了一个为用户接口线程提供了一个消息泵消息泵。同时包含一个。同时包含一个消息循环,以应对各种事件。消息循环,以应对各种事件。MFCMFC应用程序的应用程序的CWinAppCWinApp类对象类对象是一个典型的用户是一个典型的用户接口线程接口线程 在在MFCMFC应用程序中,应用程序中,CWinThreadCWinThread是用户接口线程的是用户接口线程的基类,基类,CWinAppCWinApp就是从就是从CWinThread CWinThread 类派生出来的,编类派生出来的

11、,编写用户接口线程候,也需要从写用户接口线程候,也需要从CWinThread CWinThread 类派生。类派生。2工作线程工作线程 工作线程工作线程(worker threadworker thread),),适用于处理那些不适用于处理那些不要求用户输入并且比较消耗时间的其他任务要求用户输入并且比较消耗时间的其他任务 。对用户。对用户来说,来说,工作线程运行在后台工作线程运行在后台。这就使得工作线程特别。这就使得工作线程特别适合去等待一个事件的发生。适合去等待一个事件的发生。CWinThread CWinThread 类同样是工作线程的基类。在编写工类同样是工作线程的基类。在编写工作线程的

12、时候,可以调用作线程的时候,可以调用MFCMFC的的AfxBeginThreadAfxBeginThread函数,函数,来创建来创建CWinThreadCWinThread对象。对象。7.3.2创建创建MFC的工作线程的工作线程利用利用MFCMFC创建工作线程的步骤:创建工作线程的步骤:u第一步第一步:编程实现控制函数编程实现控制函数u第二步第二步:创建并启动工作线程:创建并启动工作线程 一般不必从一般不必从CWinThreadCWinThread派生一个类。如果需要一派生一个类。如果需要一个特定版本的个特定版本的 CWinThread CWinThread 类,也可以去派生;但对类,也可以去

13、派生;但对于大多数的工作线程是不要求的。可以不作任何修改于大多数的工作线程是不要求的。可以不作任何修改地使用地使用CWinThreadCWinThread类。类。7.3.2创建创建MFC的工作线程的工作线程1 1、编程实现控制函数、编程实现控制函数 一个工作线程一个工作线程对应一个控制函数对应一个控制函数。线程执行的任。线程执行的任务都应编写在控制函数之中,规定了该线程的执行代务都应编写在控制函数之中,规定了该线程的执行代码,当控制函数执行结束而退出时,线程也就随之终码,当控制函数执行结束而退出时,线程也就随之终止。止。编写工作线程的控制函数必须遵守一定的格式,编写工作线程的控制函数必须遵守一

14、定的格式,控制函数的原型声明是:控制函数的原型声明是:UINT ControlFunctionName(LPVOID pParam);UINT ControlFunctionName(LPVOID pParam);pParampParam是一个数据结构;是一个数据结构;7.3.2创建创建MFC的工作线程的工作线程2创建并启动工作线程创建并启动工作线程(Startingthethread)启动线程启动线程:即开始运行它对应的控制函数:即开始运行它对应的控制函数。在主线程或其他线程中调用在主线程或其他线程中调用AfxBeginThreadAfxBeginThread()()函数函数就可以创建新的线

15、程,并使新线程开始运行。一般将就可以创建新的线程,并使新线程开始运行。一般将线线程的创建者称为新线程的程的创建者称为新线程的父线程父线程。AfxBeginThread()AfxBeginThread()函数有两个重载的版本,区别函数有两个重载的版本,区别在于使用的入口参数不同。在于使用的入口参数不同。7.3.2创建创建MFC的工作线程的工作线程CWinThread*CWinThread*AfxBeginThreadAfxBeginThread(AFX_THREADPROC AFX_THREADPROC pfnThreadProcpfnThreadProc,/,/控制函数的地址控制函数的地址 L

16、PVOID LPVOID pParampParam,/,/数据结构的指针,传数据给线程控制函数数据结构的指针,传数据给线程控制函数 int int pPrioritypPriority=THREAD_PRIORITY_NORMAL,/=THREAD_PRIORITY_NORMAL,/优先级优先级 UINT UINT nStackSizenStackSize=0,/=0,/线程的堆栈大小(缓冲区)线程的堆栈大小(缓冲区)DWORD DWORD dwCreateFlagsdwCreateFlags=0,/=0,/线程的运行状态,是否被挂起线程的运行状态,是否被挂起 LPSECURITY_ATTTR

17、IBUTES LPSECURITY_ATTTRIBUTES lpSecurityAttrslpSecurityAttrs=NULL=NULL/安全属性安全属性););后面后面4 4个参数为可选参数。个参数为可选参数。创建工作线程的例子创建工作线程的例子3、创建工作线程的例子、创建工作线程的例子功能:求长度为功能:求长度为N N的数组的数组Arry的各元素的和。的各元素的和。编程实现线程控制函数编程实现线程控制函数(1 1)/首先定义了一个结构:首先定义了一个结构:struct int N;/数组元素的个数。数组元素的个数。double*Arry;/指向一个双精度实数的数组指向一个双精度实数的数

18、组myData;/定义了此结构类型的变量,省略了初始化的代码定义了此结构类型的变量,省略了初始化的代码myData ss;创建工作线程的例子创建工作线程的例子(2 2)/接着定义线程的控制函数。接着定义线程的控制函数。UINT MyCalcFunc(LPVOID pParam)/如果入口参数为空指针,终止线程。if (pPara=NULL)AfxEndThread(MY_NULL_POINTER_ERROR);int N=pPara-N;/数组的元素个数。double*Arry=pPara-Arry;/指向数组的第一个元素。double sum=0;/数组元素之和。for(int i=0;i0

19、)if(FD_ISSET(s,&fdread)/对该套接字进行读操作对该套接字进行读操作8.2WSAAsyncSelect异步异步I/O模型模型 异步异步I/OI/O模型通过调用模型通过调用WSAAsyncSelectWSAAsyncSelect函数实现。函数实现。利用这个模型,应用程序可在一个套接字上,接收以利用这个模型,应用程序可在一个套接字上,接收以Windows Windows 消息为基础的网络事件通知。该模型最早出消息为基础的网络事件通知。该模型最早出现于现于WinsockWinsock的的1.11.1中,以适应其多任务消息环境。中,以适应其多任务消息环境。1WSAAsyncSele

20、ct函数函数函数的定义是:函数的定义是:intWSAAsyncSelect(SOCKETs,HWNDhWnd,unsignedintwMsg,longlEvent);2 2窗口回调例程窗口回调例程 应用程序在一个套接字上调用应用程序在一个套接字上调用WSAAsyncSelectWSAAsyncSelect函函数时,该函数的数时,该函数的hWndhWnd参数指定了一个参数指定了一个窗口句柄窗口句柄。函数。函数成功调用后,当指定的网络事件发生时,会自动执行成功调用后,当指定的网络事件发生时,会自动执行该窗口对应的窗口回调例程该窗口对应的窗口回调例程 。并将网络事件通知和并将网络事件通知和Windo

21、wsWindows消息的相关信息,传递给该例程的入口参数,消息的相关信息,传递给该例程的入口参数,用户可以在该例程中添加自己的代码,针对不同的网用户可以在该例程中添加自己的代码,针对不同的网络事件进行处理络事件进行处理 ,从而实现有序的套接字输入和输,从而实现有序的套接字输入和输出。出。窗口回调例程应定义成如下形式:窗口回调例程应定义成如下形式:LRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);3举例举例8.3WSAEventSelect事件选择模型事件选择模型 WSAEventSelect WSAEv

22、entSelect事件选择模型和事件选择模型和 WSAAsyncSelect WSAAsyncSelect模型类似,它也允许程序在一个或多个套接字上模型类似,它也允许程序在一个或多个套接字上 ,接,接收以事件为基础的网络事件通知。收以事件为基础的网络事件通知。表表8.28.2总结的由总结的由WSAAsyncSelectWSAAsyncSelect模型采用的网络事模型采用的网络事件件 ,均可原封不动地移植到事件选择模型中。也就是,均可原封不动地移植到事件选择模型中。也就是说说 ,在用新模型开发的应用程序中,也能接收和处理,在用新模型开发的应用程序中,也能接收和处理所有那些事件。该模型最主要的差别

23、在于所有那些事件。该模型最主要的差别在于 ,网络事件网络事件会投递至一个事件对象句柄会投递至一个事件对象句柄 ,而非投递至一个窗口例,而非投递至一个窗口例程程。以下按照使用此模型的编程步骤介绍。以下按照使用此模型的编程步骤介绍。1创建事件对象句柄创建事件对象句柄 事件选择模型要求应用程序针对每一个套接字,事件选择模型要求应用程序针对每一个套接字,首先创建一个事件对象。方法是调用首先创建一个事件对象。方法是调用WSACreateEventWSACreateEvent函数,它的定义如下:函数,它的定义如下:WSAEVENT WSACreateEvent(void);WSAEVENT WSACrea

24、teEvent(void);返回值返回值:一个创建好的:一个创建好的事件对象句柄事件对象句柄。2关联套接字和事件对象,注册关心的网络事件关联套接字和事件对象,注册关心的网络事件 有了事件对象句柄后有了事件对象句柄后 ,接下来将其与某个套接字,接下来将其与某个套接字关联在一起关联在一起 ,同时注册感兴趣的网络事件类型(表,同时注册感兴趣的网络事件类型(表8-8-2 2),这就需要调用),这就需要调用WSAEventSelectWSAEventSelect函数:函数:intWSAEventSelect(SOCKETs,WSAEVENThEventObject,longlNetworkEvents)

25、;3.3.等待网络事件触发事件对象句柄的工作状态等待网络事件触发事件对象句柄的工作状态 套接字同一个事件对象句柄关联在一起以后,程序便调用套接字同一个事件对象句柄关联在一起以后,程序便调用WSAWaitForMultipleEventsWSAWaitForMultipleEvents函数,等待网络事件触发事件对象函数,等待网络事件触发事件对象句柄的工作状态:句柄的工作状态:DWORDWSAWaitForMultipleEvents(DWORDcEvents,constWSAEVENTFAR*lphEvents,BOOLfWaitAll,DWORDdwTimeout,BOOLfAlertable

26、);该函数用来等待一个或多个事件对象句柄,当其中一个或该函数用来等待一个或多个事件对象句柄,当其中一个或所有句柄进入所有句柄进入“已传信已传信”状态后,或在超过了一个规定的时间状态后,或在超过了一个规定的时间期限后,立即返回。期限后,立即返回。4检查套接字上所发生的网络事件类型检查套接字上所发生的网络事件类型 知道了造成网络事件的套接字后,接下来可调用知道了造成网络事件的套接字后,接下来可调用WSAEnumNetworkEventsWSAEnumNetworkEvents函数,检查套接字上发生了什函数,检查套接字上发生了什么类型的网络事件。该函数定义如下:么类型的网络事件。该函数定义如下:in

27、t WSAEnumNetworkEvents(SOCKET s,WSAEVENT hEventObject,LPWSANETWORKEVENTS LPWSANETWORKEVENTS lpNetworkEventslpNetworkEvents);5处理网络事件处理网络事件 在确定了套接字上发生的网络事件类型后在确定了套接字上发生的网络事件类型后 ,可以根据不同,可以根据不同的情况做出相应的处理。完成了对的情况做出相应的处理。完成了对WSANETWORKEVENTS WSANETWORKEVENTS 结构中的结构中的事件的处理之后,应用程序应在所有可用的套接字上事件的处理之后,应用程序应在所有

28、可用的套接字上 ,继续等,继续等待更多的网络事件。待更多的网络事件。完成了对一个事件对象的处理后,应调用完成了对一个事件对象的处理后,应调用WSACloseEventWSACloseEvent函函数,释放由事件句柄使用的系统资源。函数的定义如下:数,释放由事件句柄使用的系统资源。函数的定义如下:BOOL WSACloseEvent(WSAEVENT hEvent);该函数也将一个事件句柄作为自己唯一的参数该函数也将一个事件句柄作为自己唯一的参数 ,并会在成功后,并会在成功后返回返回TRUETRUE,失败后返回,失败后返回FALSEFALSE。6举例举例 8.4其他模型其他模型重叠重叠I/O I

29、/O 模型模型 在在WinsockWinsock中,能使应用程序达到更佳的性能中,能使应用程序达到更佳的性能 。重叠模型的基本原理是让应用程序使用一个重叠的数重叠模型的基本原理是让应用程序使用一个重叠的数据结构据结构 ,一次投递一个或多个,一次投递一个或多个Winsock Winsock 的的I/OI/O请求。请求。针对那些提交的请求,在它们完成之后,应用程序可针对那些提交的请求,在它们完成之后,应用程序可为它们提供服务。自为它们提供服务。自Winsock 2.0Winsock 2.0发布开始,重叠发布开始,重叠I/OI/O便已集成到新的便已集成到新的WinsockWinsock函数中。因此,

30、重叠函数中。因此,重叠I/OI/O模型模型适用于安装了适用于安装了Winsock 2.0Winsock 2.0的所有的所有WindowsWindows平台。平台。“完成端口完成端口”模型模型 是迄今为止最为复杂的一种是迄今为止最为复杂的一种I/OI/O模型。然而,假若模型。然而,假若一个应用程序同时需要管理为数众多的套接字一个应用程序同时需要管理为数众多的套接字 ,那么,那么采用这种模型,往往可以达到最佳的系统性能采用这种模型,往往可以达到最佳的系统性能 !该模!该模型只适用于型只适用于Windows NTWindows NT和和Windows 2000 Windows 2000 操作系统。因操作系统。因其设计的复杂性其设计的复杂性 ,只有在你的应用程序需要同时管理,只有在你的应用程序需要同时管理数百乃至上千个套接字的时候数百乃至上千个套接字的时候 ,而且希望随着系统内,而且希望随着系统内安装的安装的CPUCPU数量的增多,应用程序的性能也可以线性提数量的增多,应用程序的性能也可以线性提升时,才应考虑采用升时,才应考虑采用“完成端口完成端口”模型。模型。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁