华北电力大学科技学院 windows实验报告.docx
- 文档编号:3742731
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:20
- 大小:256.14KB
华北电力大学科技学院 windows实验报告.docx
《华北电力大学科技学院 windows实验报告.docx》由会员分享,可在线阅读,更多相关《华北电力大学科技学院 windows实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
华北电力大学科技学院windows实验报告
科技学院
课程设计(综合实验)报告
(2013--2014年度第2学期)
名称:
Windows体系编程
题目:
课内综合实验
院系:
信息工程系
班级:
计算机11K1
学号:
学生姓名:
指导教师:
王新颖
实验学时:
12学时
成绩:
日期:
2014年6月6日
实验一类Windows进程任务管理器实验
一、实验目的
理解Windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护,实现一个类Windows的进程任务管理器。
二、实验要求
程序可为控制台或带界面应用程序,要求有较好的用户体验,完成功能:
1.能够完成创建进程的功能,打印输出新建进程ID。
2.获取当前系统进程信息,列出可选显示进程信息项,根据选择显示输出进程信息。
3.终止任意进程并获取退出代码。
4.具体实现技术不限。
三、实验原理
(1)进程的创建
进程的创建通过CreateProcess()函数来实现,CreateProcess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。
具体地,在执行CreateProcess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。
随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。
在创建主线程时,也是首先由系统负责创建一个线程内核对象,并初始化为1。
最后启动主线程并执行进程的入口函数WinMain(),完成对进程和执行线程的创建。
CreateProcess()函数的原型声明如下:
BOOLCreateProcess(
LPCTSTRlpApplicationName,//可执行模块名
LPTSTRlpCommandLine,//命令行字符串
LPSECURITY_ATTRIBUTESlpProcessAttributes,//进程的安全属性
LPSECURITY_ATTRIBUTESlpThreadAttributes,//线程的安全属性
BOOLbInheritHandles,//句柄继承标志
DWORDdwCreationFlags,//创建标志
LPVOIDlpEnvironment,//指向新的环境块的指针
LPCTSTRlpCurrentDirectory,//指向当前目录名的指针
LPSTARTUPINFOlpStartupInfo,//指向启动信息结构的指针
LPPROCESS_INFORMATIONlpProcessInformation//指向进程信息结构的指针
);
(2)进程的获取
进程的定义是为执行程序指令的线程而保留的一系列资源的集合。
进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。
进程是一些所有权的集合,一个进程拥有内存、CPU运行时间等一系列资源,为线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存、线程、文件和其他一些模块。
系统快照的获取可以通过Win32API函数CreateToolhelp32Snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。
函数的声明如下:
HANDLEWINAPICreateToolhelp32Snapshot(
DWORDdwFlags,//指定要创建包含哪一类系统信息的快照函数
DWORDth32ProcessID//指定进程的ID号,当设定为0时表示指定当前进程
);
一旦系统得到系统快照句柄,就可以对当前的标识号进行枚举,进程号通过函数Process32First()和Procee32Next()得到,这两个函数可以用于获取系统快照中第一个和下一个系统的信息,这两个函数的声明如下:
BOOLWINAPIProcess32First(
HANDLEhSnapshot,//系统快照句柄
LPPROCESSENTRY32lppe//指向结构体PROCESSENTRY32的指针
);
BOOLWINAPIProcess32Next(
HANDLEhSnapshot,//系统快照句柄
LPPROCESSENTRY32lppe//指向结构体PROCESSENTRY32的指针
);
(3)进程的终止
终止进程也就是结束进程,让进程从内存中卸载。
进程的终止的原因一般有4种。
1)主线程的入口函数返回。
2)进程中的一个线程调用ExitProcess函数。
3)次进程中的所有线程结束。
4)其他进程中又有线程都结束。
要结束当前进程一般让主线程的入口函数返回。
当用户的程序入口函数返回的时候,启动函数会调用C/C++运行期退出函数EXIT,并将用户的返回值传递给它。
EXTI函数会销毁所有全局的或静态的C++对象,然后调用系统函数ExitProcess促使操作系统终止应用程序。
ExitProcess是一个API函数,它会结束当前应用程序的执行,并设置退出代码,函数声明如下:
VoidExitProcess(UINTuExitCode);//参数uExitCode为此程序的退出代码
四、实验所需仪器、设备、材料(试剂)
Windows操作系统,MicrosoftVisualc++6.0或.NET环境,msdn帮助文档。
五、实验代码
#include
#include
#include
intCreateProcess(){
charszCommandLine[]="notepadc:
\\user.log";
STARTUPINFOsi={sizeof(si)};
PROCESS_INFORMATIONpi;
si.dwFlags=STARTF_USESHOWWINDOW;//指定wShowWindow成员有效
si.wShowWindow=TRUE;//此成员设为TRUE的话则显示新建进程的主窗口,
//为FALSE的话则不显示
BOOLbRet=:
:
CreateProcess(
NULL,//不在此指定可执行文件的文件名
szCommandLine,//命令行参数
NULL,//默认进程安全性
NULL,//默认线程安全性
FALSE,//指定当前进程内的句柄不可以被子进程继承
CREATE_NEW_CONSOLE,//为新进程创建一个新的控制台窗口
NULL,//使用本进程的环境变量
NULL,//使用本进程的驱动器和目录
&si,
&pi);
if(bRet)
{
//既然我们不使用两个句柄,最好是立刻将它们关闭
:
:
CloseHandle(pi.hThread);
:
:
CloseHandle(pi.hProcess);
printf("新进程的进程ID号:
%d\n",pi.dwProcessId);
printf("新进程的主线程ID号:
%d\n",pi.dwThreadId);
}
return0;
}
intListProcess(){
PROCESSENTRY32pe32;
//在使用这个结构之前,先设置它的大小
pe32.dwSize=sizeof(pe32);
//给系统内的所有进程拍一个快照
HANDLEhProcessSnap=:
:
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot调用失败\n");
return-1;
}
//遍历进程快照,轮流显示每个进程的信息
BOOLbMore=:
:
Process32First(hProcessSnap,&pe32);
while(bMore)
{
printf("进程名称:
%s\n",pe32.szExeFile);
printf("进程ID号:
%u\n\n",pe32.th32ProcessID);
bMore=:
:
Process32Next(hProcessSnap,&pe32);
}
//不要忘记清除掉snapshot对象
:
:
CloseHandle(hProcessSnap);
return0;
}
BOOLTerminateProcessFromId(DWORDdwId)
{
BOOLbRet=FALSE;
//打开目标进程,取得进程句柄
HANDLEhProcess=:
:
OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwId);
if(hProcess!
=NULL)
{
//终止进程
//GetExitCodeProcess(hProcess,&ExitCode);
bRet=:
:
TerminateProcess(hProcess,0);
}
CloseHandle(hProcess);
returnbRet;
}
intTiminateProcess(){
DWORDdwId;
printf("请输入您要终止的进程的ID号:
\n");
scanf("%u",&dwId);
if(TerminateProcessFromId(dwId))
{
printf("终止进程成功!
\n");
}
else
{
printf("终止进程失败!
\n");
}
return0;
}
intmain(intargc,char*argv[])
{
intchoice;//
while
(1){
printf("请选择功能:
\n1.新建进程\n2.列出进程表\n3.终止进程");
scanf("%d",&choice);
switch(choice){
case1:
CreateProcess();
break;
case2:
ListProcess();
break;
case3:
TiminateProcess();
break;
}
}
return0;
}
六、实验结果
实验二用多线程同步方法解决哲学家就餐问题
一、实验目的
理解Windows编程环境下的线程同步机制,掌握线程同步的方法,包括临界区对象、事件内核对象、互锁函数等方法,并能用线程同步解决经典的线程同步问题,体会多线程编程。
二、实验要求
1.为每个哲学家产生一个线程,设计正确的同步算法
2.每个哲学家取得一双筷子开始用餐后,即时显示“Dining…”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。
3.设定共有5个哲学家需用餐。
每位用餐耗时10秒钟以上。
4.多个哲学家须共享操作函数代码
5.最好有界面展示。
三、实验原理
本实验设计解决的是哲学家就餐问题,共有5个哲学家绕一个圆桌做在5个位置上,他们每2个人中间有一只筷子,共5只筷子,只有当每个哲学家取得他左右两边的筷子时,哲学家才能开始就餐,其它时间,哲学家只能思考或等待筷子。
为避免哲学家互相等待对方的筷子发生死锁,因此,奇数座位的哲学家按先左后右的顺序拿筷子,偶数座位的哲学家按先右后左的顺序拿筷子。
本课程设计针对5只筷子分别设置了5个事件内核对象,以保证每只筷子每次只能被取得一次;针对每个哲学家,通过共享操作函数代码,分别建立5个线程,以同步哲学家就餐。
四、实验所需仪器、设备、材料(试剂)
Windows操作系统,MicrosoftVisualc++6.0或.NET环境,msdn帮助文档。
五、实验代码
#include
#include
#defineP(S)WaitForSingleObject(S,INFINITE)
#defineV(S)ReleaseSemaphore(S,1,NULL)
#defineNUMBERS5
typedefHANDLESemaphore;
Semaphorechopstick[5];
Semaphoremutex;
Semaphoreroom;
char*philosophers[5]={"哲学家1","哲学家2","哲学家3","哲学家4","哲学家5"};
char*str[]={"得到左手边的筷子","得到右手边的筷子","得到一双筷子,开始吃饭!
","饭吃完了,该开始思考问题了"};
DWORDWINAPIphilosopher(LPVOIDlParam);
voidmain()
{
HANDLEhThread[NUMBERS];
DWORDThreadID[NUMBERS];
mutex=CreateSemaphore(NULL,1,1,"mutex");
if(!
mutex)
cout<<"创建信号量失败"< for(inti=0;i<5;i++) { chopstick[i]=CreateSemaphore(NULL,1,1,NULL); if(! chopstick[i]) cout<<"创建信号量失败"< } for(i=0;i { hThread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)philosopher,(LPVOID*)&i,0,&ThreadID[i]); if(! hThread[i]) { cout<<"创建线程失败"< } WaitForSingleObject(hThread[i],5000); } } DWORDWINAPIphilosopher(LPVOIDlParam) { inti=*(int*)lParam; while(true) { P(mutex); P(chopstick[i]); cout< P(chopstick[(i+1)%5]); cout< cout< V(chopstick[i]); V(chopstick[(i+1)%5]); cout< Sleep(1000); V(mutex); } return0; } 六、实验结果 实验三简易绘图器 一、实验目的 该实验为综合实验,通过该实验,使学生学习使用visualc++进行简单的综合功能的系统开发。 巩固Windows编程的基础知识,增加学生的利用图形子环境编程的综合能力,包括界面设计能力、使用GDI,GDI+或WPF的能力等。 二、实验要求 1.利用GDI,GDI+或WPF实现简单绘图器,选其中一种即可,编程环境不限。 2.实现绘制线条、矩形、圆形,可改变线条或填充的颜色。 三、实验原理 Windows的图形子系统经历了GDI、GDI+和WPF三个发展阶段。 1.GDI 传统的GDI(GraphicsDeviceInterface,图形设备接口)是微软随Windows1.0(1985年11月)推出的Windows基本图形子系统,用于与显卡和显示设备无关的图形界面编程,支持WYSIWYG(WhatYouSeeIsWhatYouGet,所见即所得)。 2.GDI+ 新式的GDI+是随WindowsXP(2001年10月)推出的GDI的改进版,增加了α混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能,GDI+也是.NET框架中Windows窗体使用的图形子系统。 图1参考界面 3.WPF 随WindowsVista和.NET框架3.0(2006年11月)微软又推出了全新的Windows图形子系统WPF(WindowsPresentationFoundation,视窗展示基础),它统一了桌面和浏览器等客户端应用程序的图形界面,基于DirectX和.NET框架,采用声明式XAML进行界面设计,是Windows的下一代GUI显示系统。 XAML(eXtensibleApplicationMarkupLanguage,可扩展应用程序标记语言)是一种基于XML(eXtensibleMarkupLanguage,可扩展标记语言,一种由万维网协会定义的通用数据描述语言)的用户界面标记语言,用于定义UI元素、数据绑定、事件和其他特性。 四、实验所需仪器、设备、材料(试剂) Windows操作系统,MicrosoftVisualc++6.0或.NET环境,msdn帮助文档。 五、实验代码 usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Drawing.Imaging; usingSystem.IO; usingSystem.Threading; namespace绘图程序 { publicpartialclassDraw: Form { publicDraw() { InitializeComponent(); } privateDrawToolsdt; privatestringsType; privatestringsFileName; privateboolbReSize=false; privateSizeDefaultPicSize; privatevoidpbImg_MouseDown(objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Left) { if(dt! =null) { dt.startDraw=true; dt.startPointF=newPointF(e.X,e.Y); } } } privatevoidpbImg_MouseMove(objectsender,MouseEventArgse) { Thread.Sleep(6); mousePostion.Text=e.Location.ToString(); if(dt.startDraw) { switch(sType) { case"Dot": dt.DrawDot(e);break; case"Eraser": dt.Eraser(e);break; default: dt.Draw(e,sType);break; } } } privatevoidpbImg_MouseUp(objectsender,MouseEventArgse) { if(dt! =null) { dt.EndDraw(); } } privatevoidForm1_Load(objectsender,EventArgse) { SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint,true); this.UpdateStyles(); Bitmapbmp=newBitmap(pbImg.Width,pbImg.Height); Graphicsg=Graphics.FromImage(bmp); g.FillRectangle(newSolidBrush(pbImg.BackColor),newRectangle(0,0,pbImg.Width,pbImg.Height)); g.Dispose(); dt=newDrawTools(this.pbImg.CreateGraphics(),colorHatch1.HatchColor,bmp); DefaultPicSize=pbImg.Size; } privatevoidopenPic_Click(objectsender,EventArgse) { OpenFileDialogofd=newOpenFileDialog(); ofd.Filter="JPG|*.jpg|Bmp|*.bmp|所有文件|*.*"; if(ofd.ShowDialog()==DialogResult.OK) { Bitmapbmpformfile=newBitmap(ofd.FileName); panel2.AutoScrollPosition=newPoint(0,0); pbImg.Size=bmpformfile.Size; reSize.Location=newPoint(bmpformfile.Width,bmpformfile.Height); dt.DrawTools_Graphics=pbImg.CreateGraphics(); Bitmapbmp=newBitmap(pbImg.Width,pbImg.Height); Graphicsg=Graphics.FromImage(bmp); g.FillRectangle(newSolidBrush(pbImg.BackC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华北电力大学科技学院 windows实验报告 华北 电力大学 科技学院 windows 实验 报告