版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、. . . . 目 录第一章 基本原理11.1基本概念11.2各函数作用与关系51.Resource.h的作用52.CmnHdr.h的作用53.Handshake.rc的作用64.Handshake.cpp的作用与结构65.Processinfo.cpp的结构7第二章 功能描述8第三章 实现描述11第四章 总结体会1819 / 20第一章 基本原理1.1基本概念1.句柄句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句
2、柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。 句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。当一个进程被初始化时,系统要为它分配一个句柄表。该句柄表只用于核对象。2.快照快照就是给当前的系统所处的状态拍了照片,那么自然,这照片里面就存放了当前系统在拍照那会儿所处的状态,这就是快照了。所以如果要访问系统的当前状态,只需要给它拍一快照就可以进行访问了。3.进程与线程进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配
3、给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。线程是"进程"中某个单一顺序的控制流。也被称为轻量进程。计算机科学术语,指运行中的程序的调度单位。 下面的核对象可以处于已通知状态或未通知状态:a.进程b.线程c.作业d.文件e.控制台输入f.信标g.互斥对象线程可以使自己进入等待状态,直到一个对象变为已通知状态。用于控制每个对象的已通知 /未通知状态的规则要根据对象的类型而定。前面已经提到进程和线程对象的规则与作业的规则。线程具有如下的优点:(1)由于在进程的线程共享和资源,因此创建线程无须进行资源的分配,比创建一个
4、进程要顺利和会计诶得多;这也使得撤销线程比撤销一个进程所花费的时间短。(2) 同一进程中的线程间切换是在进程的地址空间中进行的,因此比进程间的不同地址空间中的切换开销要少得多。(3) 进程中的线程可以随时访问该进程所拥有的所有资源,而无需做任何切换工作。(4)同一进程中的诸多线程共享存区域和文件 ,因此它们之间可以直接进行通信,不必通过系统核。在看操作系统这本课本的时候,我尤其发现线程与进程在系统运行时的重要性,因此在参阅课本以与查阅网上资料的帮助下,我总结了一些线程与进程的区别:(1)地址空间:进程的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;(2)
5、资源拥有:进程是资源分配和拥有的单位,同一个进程的线程共享进程的资源(3)线程是处理器调度的基本单位,但进程不是.(4)二者均可并发执行简而言之,一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的存单元,而多个线程共享存,从而极提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将
6、多个线程看做多个独立的应用,来实现进程的调度和管理以与资源分配。这就是进程和线程的重要区别。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执。4.模块模块是在程序设计中,为完成某一功能所需的一段程序或子程序;或指能由编译程序、
7、装配程序等处理的独立程序单位;或指大型软件系统的一部分。5.列表框列表框英文意思为ListBox,列表框中的项目是通过程序插入到其中的,用户无法向清单中输入数据,当选择其中的项目,并在用户单击一个按钮或者执行某个操作时,由应用程序完成对指定项目的具体操作。,ListBox窗口用来列出一系列的文本,每条文本占一行,用户可以从中选择一项或多项。当项总数超过可以显示的项数时,则会自动向ListBox控件添加滚动条。6.组合框组合框控件很简单,可以节省空间。组合框的风格取值定义了组合框的具体属性,包括是否自动排序,是否有滚动条。7.LRESULTLRESULT是一个数据类型。8.MFCMFC(Micr
8、osoft Foundation Classes),是一个微软公司提供的类库(class libraries),以C+类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的建控件和组件的封装类。在MFC应用程序中传输的消息有三种类型:窗口消息、命令消息和控件通知。1.2各函数作用与关系1.Resource.h的作用Resource.h是用户所有资源的ID,如果源代码中需要使用这些ID的话,就需要包含这个文件。它是由VC自己维护的,一般不用修改它。2.CmnHdr.h的作用此程序要包含Cm
9、mHdr.h头文件,并且要在其他头文件之前包含。这个文件包含 Unicode建立选项、窗口定义和第4级警告、Pragma消息帮助宏、chINRANGE和chDIMOF宏、chBEGINTHREADEX宏、对x86平台的调试断点改进、建立软件异常代码、chMB宏、chASSERT和chVERIFY宏、chHANDLE_DLGMSG宏、chSETDLGICONS宏、OS版本检查联函数、确认宿主系统是否支持Unicode、强制程序寻找(w)WinMain进入点函数。3.Handshake.rc的作用设置了窗口的字体、字号、组合框、列表框、编辑控件的参数等。4.Handshake.cpp的作用与结构H
10、andshake.cpp由5个函数组成,各个函数的作用如下:(1).DWORD WINAPI ServerThread(PVOID pvParam),是一个返回 DWORD(32位数据)的 API 函数。(2).BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)。OnInitDialog是MFC的面向对象编程语言的类CDialog中的成员函数名。他的函数原型为CDialog:OnInitDialog virtual BOOL OnInitDialog();调用这个成员函数是对WM_INITDIALOG消息作出的反应。这
11、条消息是在对话框即将显示之前,在Create,CreateIndirect或DoModal调用期间发出的。如果在对话框初始化后需要执行特别处理,覆盖该函数。首先调用基类OnInitDialog,但不考虑其返回值。正常情况下,覆盖的函数返回TRUE。Windows调用OnInitDialog函数是通过标准的全局对话框过程(它们对于所有的Microsoft基础类库的对话框是通用的),而不是通过消息映射。因此该函数不需要消息映射入口。(3).void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify),主要是用来处理消息(控
12、件,菜单,加速键)的。(4).INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)(5).int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) (6).ServerThread,函数,该函数立即让服务器等待客户机的请求。 (7).DialogBox函数,该函数负责显示应用程序的用户界面。5.Processinfo.cpp的结构函数之间的调用关系是:在运行函数5的时候需要调用函数4,而运行的函数4中需要分
13、别调用函数3以与函数2,具体见下表: 5 4 3 2 表1-1第二章 功能描述在老师已给出的文件夹里有一个exe文件, 其中里面包含Handshake应用程序“09 Handshake.exe ”,它展示了自动重置事件的使用情况。当运行Handshake应用程序时,就会出现如下图所示的对话框。 图2-1 图2-2Handshake应用程序一开始会先收到一个请求字符串,Handshake应用程序在完成将请求字符串反转,将结果放入Result域时所用的方法不同一般的应用程序,而这也是其优点之所在吧。Handshake能够解决常见的编程问题。现在有一个之间需要互相进行通信的客户机和一个服务器。开始时
14、,服务器会由于长期无事可做,因此它进入等待状态,直到客户机向服务器发送申请请求通知的时候。客户机想把一个请求提交给服务器时,它它会把请求先放入一个共享存的缓冲区中,然后再向服务器发出一个事件通知。这时候,服务器会从等到状态走出,服务器线程会查看数据缓冲区并处理客户机的请求。相反,当服务器线程忙于处理该请求的时候,客户机的线程则会进入等待状态,直到服务器发出另一个事件通知,指明结果已经准备好。这时候客户机则要对服务器传出的结果进行相应的处理。当客户机再次被唤醒的时候,结果已经放入共享数据缓冲区中,并且客户机会把最终结果显示给用户。当Handshake用程序启动运行时,它立即创建两个未通知的自动重
15、置的事件对象。一个事件是用于指明何时为服务器准备一个请求的g_hevtRequestSubmitted,服务器线程用来等待g_hevtRequestSubmitted,而客户机线程则会发出通知通知该事件。第二个事件是 g_hevtResultReturned,用来指明何时为客户机准备好结果。客户机线程等待该事件,而服务器线程则负责发出该事件的通知。当各个事件创建后,服务器线程就产生ServerThread函数。该函数立即让服务器等待客户机的请求。然后服务器线程会执行该函数, 与此同时,主线程也是客户机线程也会同时调用 DialogBox函数,该函数负责显示应用程序的用户界面。可以将一些文字输入
16、 Request域,然后,当点击 Submit Request ToServer(将请求提交给服务器)时,请求字符串将被放入由客户机和服务器线程共享的一个缓冲区,并发出g_hevtRequestSubmitted事件的通知。然后客户机线程通过等待 g_hevtResultReturened事件来等待服务器的结果。服务器醒来,将共享存缓冲区中的字符串反转,然后发出 g_hevtResultReturned事件的通知。服务器的线程循环运行,以便等待客户机的另一个请求。该应用程序决不会调用ResetEvent函数,因为没有必要。自动重置的事件在等待成功后会自动恢复未通知状态。与此同时,客户机线程发现
17、 g_hevtResultReturned事件已经变为已通知状态。它醒来,并将字符串从共享存缓冲区拷贝到用户界面的 Result域。关闭该应用程序时,只需要关闭它的对话框即可。这会导致调用的 _tWinMain中的DialogBox函数返回。这时,主线程将一个特殊字符串拷贝到共享缓冲区,并唤醒服务器的线程,以便处理该特殊请求。主线程等待服务器线程确认请求已经收到,并等待服务器线程终止运行。当服务器线程发现该特殊的客户机请求字符串时,它就退出循环,而该线程则终止运行。主线程等待服务器线程终止运行的方法是调用 WaitForMultipleObjects函数,这样,就可以看到该函数是如何使用的。实
18、际上,也可以调用 WaitForSingleObject函数,传递服务器线程的句柄,一切将以完全一样的方式来运行。一旦主线程知道服务器线程已经停止运行后,我将 3次调用CloseHandle函数,以便正确地撤消应用程序正在使用的所有核对象。当然,系统能够自动执行这项操作,但是如果我自己进行操作,我的感觉会更好些。我喜欢能够随时控制我的代码。第三章 实现描述#include ".CmnHdr.h" /*/* See Appendix A. */#include <windowsx.h>#include <tchar.h>#include <pro
19、cess.h> / For beginthreadex#include "Resource.h"/ 当客户端从服务器返回时该事件被通知(客户端将字符放入共享缓存时被通知)HANDLE g_hevtRequestSubmitted;/ 当服务器完成翻转字符串时该事件被通知HANDLE g_hevtResultReturned;/ 客户端和服务器共享的缓存区TCHAR g_szSharedRequestAndResultBuffer1024;/ 客户端发送这个指定的值导致服务端线程终止TCHAR g_szServerShutdown = TEXT("Server
20、 Shutdown");/ 这些代码被服务器端线程执行DWORD WINAPI ServerThread(PVOID pvParam) /假设服务器端线程不会永远执行 BOOL fShutdown = FALSE; while (!fShutdown) /等待事件对象通知 WaitForSingleObject(g_hevtRequestSubmitted, INFINITE); / 读取共享缓存区的值并与g_szServerShutdown比较,判断客户端线程是否要 求服务器端线程终止运行 Shutdown=(lstrcmpi(g_szSharedRequestAndResultB
21、uffer, g_szServerShutdown) = 0); /如果不是预定义的字符被传入,那么将进行翻转处理 if (!fShutdown) / Process the client's request (reverse the string) _tcsrev(g_szSharedRequestAndResultBuffer); /翻转处理完成,通知客户端线程来读取共享缓存区的容 SetEvent(g_hevtResultReturned); return(0);BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lPa
22、ram) /用来设置程序图标的宏 /隐藏由于ComboBoxValue不支持字符而引入的ModelHelp控件 chSETDLGICONS(hwnd, IDI_HANDSHAKE); /也是一个宏.用于设置文本框的初始值 Edit_SetText(GetDlgItem(hwnd, IDC_REQUEST), TEXT("Some test data"); return(TRUE);/响应菜单选择事件的回调函数void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) switch (id) /消息
23、处理退出消息 case IDCANCEL: EndDialog(hwnd, id); break; /处理按钮点击消息 case IDC_SUBMIT: /获取文本框的值,第一个参数句柄,第二个缓存区,第三个要获取的长度 Edit_GetText(GetDlgItem(hwnd, IDC_REQUEST), g_szSharedRequestAndResultBuffer, chDIMOF(g_szSharedRequestAndResultBuffer); /将g_hevtRequestSubmitted置为通知状态使客户端线程可以读取缓存区容 SetEvent(g_hevtRequestS
24、ubmitted); /等待服务器端线程翻转成功的事件通知并将结果文本框容更新 WaitForSingleObject(g_hevtResultReturned, INFINITE); Edit_SetText(GetDlgItem(hwnd, IDC_RESULT), g_szSharedRequestAndResultBuffer); break; INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch (uMsg) chHANDLE_DLGMSG(hwnd, WM_INITDIA
25、LOG, Dlg_OnInitDialog); chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand); return(FALSE);int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) /自动重置的未通知状态的事件对象 g_hevtRequestSubmitted = CreateEvent(NULL, FALSE, FALSE, NULL); g_hevtResultReturned = CreateEvent(NULL, FALSE, FALSE, N
26、ULL); /创建服务器线程 DWORD dwThreadID;HANDLE hThreadServer = chBEGINTHREADEX(NULL, 0, ServerThread, NULL, 0, &dwThreadID); /这是一个模态的对话框,运行客户端线程的用户界面。 DialogBox(hinstExe, MAKEINTRESOURCE(IDD_HANDSHAKE), NULL, Dlg_Proc); / 模态对话框退出以后,向服务器线程发送g_szServerShutdown / 并将g_hevtRequestSubmitted事件设为通知状态让服务器端线程运行(退出的代码) lstrcpy(g_szSharedRequestAndResultBuffer, g_szServerShutdown); SetEvent(g_hevtRequestSubmitted); / 等待服务器线程得到关闭通知并且完全关闭 HANDLE h2; h0 = g_hevtResultReturned; h1 = hThreadServer; WaitForMultipleObjects(2, h, TRUE, INFINITE);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 16《太阳》说课稿-2024-2025学年统编版语文五年级上册
- 2024年秋二年级道德与法治下册 第三单元 谢谢你的爱 8 让爷爷奶奶开心说课稿 教科版
- 3 古诗三首 迢迢牵牛星(说课稿)-2023-2024学年统编版语文六年级下册
- 10养昆虫(说课稿)-2023-2024学年科学四年级下册苏教版001
- 8 安全记心上-《“119”的警示》(说课稿)统编版道德与法治六年级下册
- 2016七年级信息技术上册 第14课 完善与发布网站说课稿 新人教版
- 二零二五年度砂石资源买卖与回收协议3篇
- 2023三年级英语上册 Unit 2 Friends and Colours Lesson Lesson 11 Orange,Brown,White,Black说课稿 冀教版(三起)
- 1 古诗三首 三衢道中(说课稿)-2023-2024学年统编版语文三年级下册
- 二零二五年度离婚协议中离婚后子女监护权变更要点3篇
- 苏教版四年级数学下册第三单元第二课时《常见的数量关系》课件
- SaaS服务具体应用合同范本2024版版
- 浙江省台州市2021-2022学年高一上学期期末质量评估政治试题 含解析
- 宁夏“8·19”较大爆燃事故调查报告
- 中国高血压防治指南(2024年修订版)解读课件
- 2024年浙江省中考科学试卷
- 初三科目综合模拟卷
- 2024年全国高考新课标卷物理真题(含答案)
- 劳动合同薪酬与绩效约定书
- 消除医疗歧视管理制度
- 柴油机油-标准
评论
0/150
提交评论