版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计(综合实验)报告( 2014 - 2015 年度第 学期)名 称: Windows体系编程 题 目: 课内综合实验 院 系: 计算机系 班 级: 学 号: 学生姓名: 指导教师: 实验学时: 12学时 成 绩: 日期: 2015 年 4 月 28 日一、课程设计(综合实验)的目的与要求1 正文为宋体,五号字 行间距为21 11 -12 -二、设计(实验)正文1 正文为宋体,五号字 行间距为21 11 -12 -三、课程设计(综合实验)总结或结论1 正文为宋体,五号字 行间距为21 11 -12 -四、参考文献 1 作者1, 作者2. 书名. 出版单位, 版本. 出版日期附录(设计流程图
2、、程序、表格、数据等)注:根据课程设计、综合实验的内容将标题任选其一。实验一 进程管理实验一、实验目的 理解Windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护。二、实验要求 1. 编写一段程序,能够完成创建进程的功能,要求启动windows记事本程序(notepad.exe),同时打开一个文本文件,路径为:c:systemuser.log 。并打印出新建进程ID。2. 获取当前系统进程信息,打印输出进程名称和ID号。3. 终止新创建的进程并获取退出代码。三、实验原理(1)进程的创建进程的创建通过CreateProcess()函数来实现,C
3、reateProcess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。具体地,在执行CreateProcess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。在创建主线程时,也是首先由系统负责创建一个线程内核对象,并初始化为1。最后启动主线程并执行进程的入口函数WinMain(),完成对进程和执行线程的创建。CreateProcess()函数的原型声明如下:BOOL CreateProcess(LPCTSTR lpApplicat
4、ionName, / 可执行模块名LPTSTR lpCommandLine, / 命令行字符串LPSECURITY_ATTRIBUTES lpProcessAttributes, / 进程的安全属性 LPSECURITY_ATTRIBUTES lpThreadAttributes, / 线程的安全属性 BOOL bInheritHandles, / 句柄继承标志 DWORD dwCreationFlags, / 创建标志 LPVOID lpEnvironment, / 指向新的环境块的指针 LPCTSTR lpCurrentDirectory, / 指向当前目录名的指针 LPSTARTUPIN
5、FO lpStartupInfo, / 指向启动信息结构的指针 LPPROCESS_INFORMATION lpProcessInformation / 指向进程信息结构的指针 );(2)进程的获取进程的定义是为执行程序指令的线程而保留的一系列资源的集合。进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。进程是一些所有权的集合,一个进程拥有内存、CPU运行时间等一系列资源,为线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存、线程、文件和其他一些模块。系统快照的获取可以通过Win32 API函数CreateTo
6、olhelp32Snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。函数的声明如下:HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, /指定要创建包含哪一类系统信息的快照函数DWORD th32ProcessID /指定进程的ID号,当设定为0时表示指定当前进程);一旦系统得到系统快照句柄,就可以对当前的标识号进行枚举,进程号通过函数Process32First()和Procee32Next()得到,这两个函数可以用于获取系统快照中第一个和下一个系统的信息,这两个函数的声明如下:BOOL
7、WINAPI Process32First(HANDLE hSnapshot, / 系统快照句柄LPPROCESSENTRY32 lppe / 指向结构体PROCESSENTRY32的指针);BOOL WINAPI Process32Next(HANDLE hSnapshot, / 系统快照句柄LPPROCESSENTRY32 lppe / 指向结构体PROCESSENTRY32的指针);(3)进程的终止终止进程也就是结束进程,让进程从内存中卸载。进程的终止的原因一般有4种。1) 主线程的入口函数返回。2) 进程中的一个线程调用ExitProcess函数。3) 次进程中的所有线程结束。4) 其
8、他进程中又有线程都结束。要结束当前进程一般让主线程的入口函数返回。当用户的程序入口函数返回的时候,启动函数会调用C/C+运行期退出函数EXIT,并将用户的返回值传递给它。EXTI函数会销毁所有全局的或静态的C+对象,然后调用系统函数ExitProcess促使操作系统终止应用程序。ExitProcess是一个API函数,它会结束当前应用程序的执行,并设置退出代码,函数声明如下:Void ExitProcess(UINT uExitCode); /参数uExitCode为此程序的退出代码 四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.N
9、ET环境,msdn帮助文档。5、 实验正文/ 02CreateProcess.cpp文件/#include "stdafx.h"#include <windows.h>#include <stdio.h>#include <tlhelp32.h> / 声明快照函数的头文件int CreateProcess()char szCommandLine = "notepad c:user.log"STARTUPINFO si = sizeof(si) ;PROCESS_INFORMATION pi;si.dwFlags = S
10、TARTF_USESHOWWINDOW;/ 指定wShowWindow成员有效si.wShowWindow = TRUE;/ 此成员设为TRUE的话则显示新建进程的主窗口,/ 为FALSE的话则不显示BOOL bRet = :CreateProcess (NULL,/ 不在此指定可执行文件的文件名szCommandLine,/ 命令行参数NULL,/ 默认进程安全性NULL,/ 默认线程安全性FALSE,/ 指定当前进程内的句柄不可以被子进程继承CREATE_NEW_CONSOLE,/ 为新进程创建一个新的控制台窗口NULL,/ 使用本进程的环境变量NULL,/ 使用本进程的驱动器和目录&am
11、p;si,&pi);if(bRet)/ 既然我们不使用两个句柄,最好是立刻将它们关闭:CloseHandle (pi.hThread);:CloseHandle (pi.hProcess);printf(" 新进程的进程ID号:%d n", pi.dwProcessId);printf(" 新进程的主线程ID号:%d n", pi.dwThreadId);return 0;int ListProcess()PROCESSENTRY32 pe32;/ 在使用这个结构之前,先设置它的大小pe32.dwSize = sizeof(pe32); / 给系
12、统内的所有进程拍一个快照HANDLE hProcessSnap = :CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if(hProcessSnap = INVALID_HANDLE_VALUE)printf("CreateToolhelp32Snapshot调用失败n");return -1;/ 遍历进程快照,轮流显示每个进程的信息BOOL bMore = :Process32First(hProcessSnap, &pe32);while(bMore)printf(" 进程名称:%s n", p
13、e32.szExeFile);printf(" 进程ID号:%u nn", pe32.th32ProcessID);bMore = :Process32Next(hProcessSnap, &pe32);/ 不要忘记清除掉snapshot对象:CloseHandle(hProcessSnap);return 0;BOOL TerminateProcessFromId(DWORD dwId)BOOL bRet = FALSE;/ 打开目标进程,取得进程句柄HANDLE hProcess = :OpenProcess(PROCESS_ALL_ACCESS, FALSE,
14、 dwId);if(hProcess != NULL)/ 终止进程/GetExitCodeProcess(hProcess, &ExitCode); bRet = :TerminateProcess(hProcess, 0);CloseHandle(hProcess);return bRet;int TiminateProcess()DWORD dwId;printf(" 请输入您要终止的进程的ID号: n");scanf("%u", &dwId);if(TerminateProcessFromId(dwId)printf("
15、终止进程成功! n");elseprintf(" 终止进程失败! n");return 0;int main(int argc, char* argv)int choice;/while(1)printf("请选择功能:n1.新建进程n2.列出进程表n3.终止进程");scanf("%d",&choice);switch(choice)case 1:CreateProcess();break;case 2:ListProcess();break;case 3:TiminateProcess();break;retur
16、n 0;运行结果:六、思考题 进程被终止程序的对话框关闭七、实验总结 本次实验主要是类似进程管理的,涉及创建进程,获取进程列表,终止进程,通过这次实验,加深了对进程处理过程的理解,学习到了很多东西,虽然实验过程中遇到过困难,在老师和同学的帮助下,基本得到了解决。实验二 用多线程同步方法解决哲学家就餐问题实验名称:用多线程同步方法解决哲学家就餐问题 实验类型: 设计性实验学时: 4适用对象: 软件工程专业、网络工程专业、信息安全专业一、实验目的 理解Windows编程环境下的线程同步机制,掌握线程同步的方法,包括临界区对象、事件内核对象、互锁函数等方法,并能用线程同步解决经典的线程同步问题,体会
17、多线程编程。二、实验要求 1)为每个哲学家产生一个线程,设计正确的同步算法2)每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。3)设定共有5个哲学家需用餐。每位用餐耗时10秒钟以上。4)多个哲学家须共享操作函数代码三、实验原理本实验设计解决的是哲学家就餐问题,共有5个哲学家绕一个圆桌做在5个位置上,他们每2个人中间有一只筷子,共5只筷子,只有当每个哲学家取得他左右两边的筷子时,哲学家才能开始就餐,其它时间,哲学家只能思考或等待筷子。为避免哲学家互相等待对方的筷子发生死锁,因此,奇数座位的哲学家按先左后右的顺序拿筷子
18、,偶数座位的哲学家按先右后左的顺序拿筷子。本课程设计针对5只筷子分别设置了5个事件内核对象,以保证每只筷子每次只能被取得一次;针对每个哲学家,通过共享操作函数代码,分别建立5个线程,以同步哲学家就餐。四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET环境,msdn帮助文档。五、实验预习要求、实验条件、方法及步骤 上机编程之前应熟悉课程相应的部分,实验原理及相关的数据结构。6、 实验正文/ 哲学家就餐.cpp : Defines the entry point for the console application./#includ
19、e "stdafx.h"#include <windows.h>#include <process.h>#include <iostream.h>HANDLE HChop5;CRITICAL_SECTION cs;void print(int num) :EnterCriticalSection(&cs); cout<<num<<"号哲学家"<<"Dining."<<endl; :LeaveCriticalSection(&cs);UI
20、NT WINAPI ThreadProc(LPVOID Param)int number=*(int*)(Param); for(int i = 0; i < 5; i+) if(number%2=0)/number是偶数 先右后左 WaitForSingleObject(HChopnumber-1,INFINITE); WaitForSingleObject(HChopnumber,INFINITE); print(number); Sleep(5*1000); SetEvent(HChopnumber-1); SetEvent(HChopnumber); else/先左后右 Wait
21、ForSingleObject(HChopnumber%5,INFINITE); WaitForSingleObject(HChopnumber-1,INFINITE); print(number); Sleep(5*1000); SetEvent(HChopnumber%5); SetEvent(HChopnumber-1); return 0;int main(int argc, char* argv) HANDLE H5; int *p=new int5;:InitializeCriticalSection(&cs);for(int i=0;i<5;i+) pi=i+1;/
22、Hi=CreateThread(NULL, 0,ThreadProc, &pi, 0,&dwThreadId);Hi = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, &pi, CREATE_SUSPENDED, NULL);HChopi=CreateEvent(NULL, FALSE, FALSE, NULL);for(int j=0;j<5;j+)SetEvent(HChopj); ResumeThread(Hj); WaitForMultipleObjects(5,H,TRUE,INFINITE); for(int
23、k=0;k<5;k+)CloseHandle(Hk);CloseHandle(HChopk); :DeleteCriticalSection(&cs); return 0;运行结果:六、思考题其他同步方法有:临界区法,互斥量法,信号量法,事件, 其中信号量就是本程序所采用的方法七、实验总结本次实验主要是针对线程处理的,涉及临界区,时间内核对象等相关知识,哲学家就餐问题加深了我对线程同步的认识,实验过程也不是一帆风顺,不过通过本次实验还是掌握了许多知识,收获颇丰。实验三 简易绘图器实验名称:简易绘图器 实验类型: 综合性实验学时: 4适用对象: 软件工程专业、网络工程专业
24、、信息安全专业一、实验目的 该实验为综合实验,通过该实验,使学生学习使用visual c+进行简单的综合功能的系统开发。巩固Windows编程的基础知识,增加学生的利用图形子环境编程的综合能力,包括界面设计能力、使用GDI,GDI+或WPF的能力等。二、实验要求 1.利用GDI,GDI+或WPF实现简单绘图器,选其中一种即可,编程环境不限。2.实现绘制线条、矩形、圆形,可改变线条或填充的颜色。三、实验原理Windows的图形子系统经历了GDI、GDI+ 和WPF三个发展阶段。1GDI传统的GDI(Graphics Device Interface,图形设备接口)是微软随Windows 1.0(
25、1985年11月)推出的Windows基本图形子系统,用于与显卡和显示设备无关的图形界面编程,支持WYSIWYG(What You See Is What You Get,所见即所得)。2GDI+新式的GDI+是随Windows XP(2001年10月)推出的GDI的改进版,增加了混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能,GDI+也是.NET框架中Windows窗体使用的图形子系统。图1 参考界面3WPF随Windows Vista和.NET框架3.0(2006年11月)微软又推出了全新的Windows图形子系统WPF(Windows Presentation Found
26、ation,视窗展示基础),它统一了桌面和浏览器等客户端应用程序的图形界面,基于DirectX和.NET框架,采用声明式XAML进行界面设计,是Windows的下一代GUI显示系统。XAML(eXtensible Application Markup Language,可扩展应用程序标记语言)是一种基于XML(eXtensible Markup Language,可扩展标记语言,一种由万维网协会定义的通用数据描述语言)的用户界面标记语言,用于定义UI元素、数据绑定、事件和其他特性。四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET
27、环境,msdn帮助文档。五、实验预习要求、实验条件、方法及步骤 上机编程之前应熟悉课程相应的部分,实验原理及相关的数据结构。六、实验正文#include "stdafx.h"#include "windows.h"#include "stdio.h"#include "string.h"#include "stdlib.h"/#include "math.h"LRESULT CALLBACK WndProc(HWND hwnd,UINT messgae,WPARAM wPar
28、am,LPARAM lParam);int WINAPI WinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst,LPSTR lpszCmdLine, int nCmdShow)static TCHAR szAppName = TEXT("画-图ª?"); WNDCLASS ws;HWND hWnd;MSG msg;ws.style = 0;ws.lpfnWndProc = WndProc;ws.cbClsExtra = 0;ws.cbWndExtra = 0;ws.hInstance = hThisInst;ws.hI
29、con = LoadIcon(NULL, IDI_HAND);ws.hCursor = LoadCursor(NULL,IDC_CROSS);ws.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);ws.lpszMenuName = NULL;ws.lpszClassName = szAppName;if(!RegisterClass(&ws)return -1;hWnd = CreateWindow(szAppName,TEXT("我¨°的Ì?画-图ª?"),WS_OV
30、ERLAPPEDWINDOW,100,200,640,480,NULL,NULL,hThisInst,NULL);ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;LRESULT CALLBACK WndProc(HWND hwnd,UINT messgae,WPARAM wParam,LPARAM lParam)HDC hdc;PAINTSTR
31、UCT ps;HPEN hPen;HBRUSH hbrush;POINT pt=500,300,600,180,500,100;POINT pm=100,400,200,400,250,313.4,200,226.8,100,226.8,50,313.4;switch(messgae)case WM_PAINT:hdc=BeginPaint(hwnd,&ps);SetMapMode(hdc,MM_ANISOTROPIC); /直¡À线?hPen=CreatePen(PS_SOLID,4,RGB(255,255,0);/黄?色¦?画-笔À¨ºSelectObject(hdc,hPen);MoveToEx(hdc,50,50,NULL); LineTo(hdc,300,50);/多¨¤线?段? hPen=CreatePen(PS_SOLID,4,RGB(255,0,255);/紫Á?色¦?画-笔
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 税务代理服务协议2025年争议管辖
- 2025 九年级道德与法治下册项目式学习评价表课件
- 2026年内蒙古通辽市单招职业适应性测试题库带答案详解(综合题)
- 2026年南京城市职业学院单招职业适应性测试题库含答案详解(巩固)
- 2026年北京科技大学天津学院单招综合素质考试题库及答案详解(新)
- 2026年兰州资源环境职业技术大学单招职业技能考试题库带答案详解(培优)
- 2026年内蒙古通辽市单招职业适应性考试题库带答案详解(完整版)
- 2026年保定电力职业技术学院单招职业倾向性测试题库含答案详解(研优卷)
- 2026年南京特殊教育师范学院单招职业适应性考试题库带答案详解(突破训练)
- 2026年兰州石化职业技术大学单招职业技能考试题库附参考答案详解(巩固)
- 湖北省圆创高中名校联盟2026届高三2月第三次联合测评生物试卷(含答案解析)
- 安徽农业大学《模拟电子技术》2024 - 2025 学年第一学期期末试卷
- 2026年赣州职业技术学院单招职业技能考试备考试题附答案详解
- 雇佣老人看门协议书
- 赠与财物协议书模板
- 2025广西南宁市从“五方面人员”中选拔乡镇领导班子成员111人备考题库附答案
- 高等学校学生食堂伙食结构及成本核算指导意见
- 高一年级英语上册阅读理解专项练习及答案(50篇)
- 颅内肿瘤放疗护理管理
- 低温环境透水混凝土施工工艺方案
- 火电企业设备金属健康状态监测与防控体系
评论
0/150
提交评论