windos体系编程(综合实验)_第1页
windos体系编程(综合实验)_第2页
windos体系编程(综合实验)_第3页
windos体系编程(综合实验)_第4页
windos体系编程(综合实验)_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 科 技 学 院课程设计(综合实验)报告( 2012 - 2013 年度第 2 学期)名 称: Windows体系编程 题 目: 课内综合实验 院 系: 班 级: 学 号: 学生姓名: 指导教师: 实验学时: 12学时 成 绩: 日期: 2013 年 6 月 13 日 实验一 类Windows进程任务管理器实验一、实验目的 理解Windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护,实现一个类Windows的进程任务管理器。二、实验要求 程序可为控制台或带界面应用程序,要求有较好的用户体验,完成功能:1. 能够完成创建进程的功能,打印输出新建

2、进程ID。2. 获取当前系统进程信息,列出可选显示进程信息项,根据选择显示输出进程信息。3. 终止任意进程并获取退出代码。4. 具体实现技术不限。三、实验原理(1)进程的创建进程的创建通过CreateProcess()函数来实现,CreateProcess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。具体地,在执行CreateProcess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。在创建主线程时,也是首先由系统负责创建一个线

3、程内核对象,并初始化为1。最后启动主线程并执行进程的入口函数WinMain(),完成对进程和执行线程的创建。CreateProcess()函数的原型声明如下:BOOL CreateProcess(LPCTSTR lpApplicationName, / 可执行模块名LPTSTR lpCommandLine, / 命令行字符串LPSECURITY_ATTRIBUTES lpProcessAttributes, / 进程的安全属性 LPSECURITY_ATTRIBUTES lpThreadAttributes, / 线程的安全属性 BOOL bInheritHandles, / 句柄继承标志 D

4、WORD dwCreationFlags, / 创建标志 LPVOID lpEnvironment, / 指向新的环境块的指针 LPCTSTR lpCurrentDirectory, / 指向当前目录名的指针 LPSTARTUPINFO lpStartupInfo, / 指向启动信息结构的指针 LPPROCESS_INFORMATION lpProcessInformation / 指向进程信息结构的指针 );(2)进程的获取进程的定义是为执行程序指令的线程而保留的一系列资源的集合。进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组

5、成。进程是一些所有权的集合,一个进程拥有内存、CPU运行时间等一系列资源,为线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存、线程、文件和其他一些模块。系统快照的获取可以通过Win32 API函数CreateToolhelp32Snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。函数的声明如下:HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, /指定要创建包含哪一类系统信息的快照函数DWORD th32ProcessID /指定进程的ID号,当设定为0时表示指定当前进程

6、);一旦系统得到系统快照句柄,就可以对当前的标识号进行枚举,进程号通过函数Process32First()和Procee32Next()得到,这两个函数可以用于获取系统快照中第一个和下一个系统的信息,这两个函数的声明如下:BOOL WINAPI Process32First(HANDLE hSnapshot, / 系统快照句柄LPPROCESSENTRY32 lppe / 指向结构体PROCESSENTRY32的指针);BOOL WINAPI Process32Next(HANDLE hSnapshot, / 系统快照句柄LPPROCESSENTRY32 lppe / 指向结构体PROCESS

7、ENTRY32的指针);(3)进程的终止终止进程也就是结束进程,让进程从内存中卸载。进程的终止的原因一般有4种。1) 主线程的入口函数返回。2) 进程中的一个线程调用ExitProcess函数。3) 次进程中的所有线程结束。4) 其他进程中又有线程都结束。要结束当前进程一般让主线程的入口函数返回。当用户的程序入口函数返回的时候,启动函数会调用C/C+运行期退出函数EXIT,并将用户的返回值传递给它。EXTI函数会销毁所有全局的或静态的C+对象,然后调用系统函数ExitProcess促使操作系统终止应用程序。ExitProcess是一个API函数,它会结束当前应用程序的执行,并设置退出代码,函数

8、声明如下:Void ExitProcess(UINT uExitCode); /参数uExitCode为此程序的退出代码 四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET环境,msdn帮助文档。5、 源程序#include <windows.h>#include <stdio.h>#include <tlhelp32.h> / 声明快照函数的头文件BOOL TerminateProcessFromId(DWORD dwId)BOOL bRet = FALSE;/ 打开目标进程,取得进程句柄HA

9、NDLE hProcess = :OpenProcess (PROCESS_ALL_ACCESS, FALSE, dwId); /PROCESS_ALL_ACCESS:所有权限,包括创建、读、写等。/OpenProcess如果成功,则该进程内核对象引用计数+1if(hProcess != NULL)bRet = :TerminateProcess(hProcess, 0);CloseHandle(hProcess);/结束了进程,还要使该进程内核对象引用计数-1return bRet;int main(int argc, char* argv)char szCommandLine = &quo

10、t;notepad "STARTUPINFO si = sizeof(si) ;PROCESS_INFORMATION pi;si.dwFlags = STARTF_USESHOWWINDOW;/ 指定wShowWindow成员有效si.wShowWindow = TRUE;/ 此成员设为TRUE的话则显示新建进程的主窗口,/ 为FALSE的话则不显示BOOL bRet = :CreateProcess (NULL,/ 不在此指定可执行文件的文件名szCommandLine,/ 命令行参数NULL,/ 默认进程安全性NULL,/ 默认线程安全性FALSE,/ 指定当前进程内的句柄不可

11、以被子进程继承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);PROCESSENTRY32

12、pe32;/ 在使用这个结构之前,先设置它的大小pe32.dwSize = sizeof(pe32); / 给系统内的所有进程拍一个快照HANDLE hProcessSnap = :CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if(hProcessSnap = INVALID_HANDLE_VALUE)printf(" CreateToolhelp32Snapshot调用失败! n");return -1;BOOL bMore = :Process32First(hProcessSnap, &pe32);/ 遍历快

13、照,轮流显示每个进程的信息while(bMore)printf(" 进程名称:%s n", pe32.szExeFile);printf(" 进程ID号:%u nn", pe32.th32ProcessID);bMore = :Process32Next(hProcessSnap, &pe32);/ 不要忘记清除掉snapshot对象:CloseHandle(hProcessSnap);DWORD dwId;printf(" 请输入您要终止的进程的ID号: n");scanf("%u", &dwId

14、);if(TerminateProcessFromId(dwId)printf(" 终止进程成功! n");elseprintf(" 终止进程失败! n");return 0;六、运行结果 实验二 用多线程同步方法解决哲学家就餐问题一、实验目的 理解Windows编程环境下的线程同步机制,掌握线程同步的方法,包括临界区对象、事件内核对象、互锁函数等方法,并能用线程同步解决经典的线程同步问题,体会多线程编程。二、实验要求 1. 为每个哲学家产生一个线程,设计正确的同步算法2. 每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标识

15、符以及餐桌上所有几位哲学家标识符及其所坐的位置。3. 设定共有5个哲学家需用餐。每位用餐耗时10秒钟以上。4. 多个哲学家须共享操作函数代码5. 最好有界面展示。三、实验原理本实验设计解决的是哲学家就餐问题,共有5个哲学家绕一个圆桌做在5个位置上,他们每2个人中间有一只筷子,共5只筷子,只有当每个哲学家取得他左右两边的筷子时,哲学家才能开始就餐,其它时间,哲学家只能思考或等待筷子。为避免哲学家互相等待对方的筷子发生死锁,因此,奇数座位的哲学家按先左后右的顺序拿筷子,偶数座位的哲学家按先右后左的顺序拿筷子。本课程设计针对5只筷子分别设置了5个事件内核对象,以保证每只筷子每次只能被取得一次;针对每

16、个哲学家,通过共享操作函数代码,分别建立5个线程,以同步哲学家就餐。四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET环境,msdn帮助文档。5、 源程序#include<windows.h>#include<process.h>#include<iostream>using namespace std;HANDLE g_chops5;UINT WINAPI Philo(PVOID pvParam)int n = atoi(char *) pvParam);if(n%2=1)for(int i=

17、0;i<5;i+):WaitForSingleObject(g_chopsn-1,INFINITE);:WaitForSingleObject(g_chopsn,INFINITE);cout<<n<<" is dinning."<<endl<<endl;:Sleep(10000);cout<<n<<" finished!"<<endl<<endl;:SetEvent(g_chopsn);:SetEvent(g_chopsn-1);elsefor(int

18、i=0;i<5;i+):WaitForSingleObject(g_chopsn,INFINITE);:WaitForSingleObject(g_chopsn-1,INFINITE);cout<<n<<" is dinning."<<endl<<endl;:Sleep(10000);cout<<n<<" finished!"<<endl<<endl;:SetEvent(g_chopsn-1);:SetEvent(g_chopsn);return 0;i

19、nt main(int argc, char* argv)for(int i=0;i<5;i+)g_chopsi=:CreateEvent(NULL,FALSE,TRUE,NULL);HANDLE hThread5;hThread0=(HANDLE)_beginthreadex(NULL,0,Philo,"1",0,NULL);Sleep(10);hThread1=(HANDLE)_beginthreadex(NULL,0,Philo,"2",0,NULL);Sleep(10);hThread2=(HANDLE)_beginthreadex(NUL

20、L,0,Philo,"3",0,NULL);Sleep(10);hThread3=(HANDLE)_beginthreadex(NULL,0,Philo,"4",0,NULL);Sleep(10);hThread4=(HANDLE)_beginthreadex(NULL,0,Philo,"5",0,NULL);Sleep(10);getchar();return 0;6、 运行结果实验三 简易绘图器 一、实验目的 该实验为综合实验,通过该实验,使学生学习使用visual c+进行简单的综合功能的系统开发。巩固Windows编程的基础知

21、识,增加学生的利用图形子环境编程的综合能力,包括界面设计能力、使用GDI,GDI+或WPF的能力等。二、实验要求 1.利用GDI,GDI+或WPF实现简单绘图器,选其中一种即可,编程环境不限。2.实现绘制线条、矩形、圆形,可改变线条或填充的颜色。三、实验原理Windows的图形子系统经历了GDI、GDI+ 和WPF三个发展阶段。1GDI传统的GDI(Graphics Device Interface,图形设备接口)是微软随Windows 1.0(1985年11月)推出的Windows基本图形子系统,用于与显卡和显示设备无关的图形界面编程,支持WYSIWYG(What You See Is Wh

22、at You Get,所见即所得)。2 GDI+新式的GDI+是随Windows XP(2001年10月)推出的GDI的改进版,增加了混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能,GDI+也是.NET框架中Windows窗体使用的图形子系统。3WPF随Windows Vista和.NET框架3.0(2006年11月)微软又推出了全新的Windows图形子系统WPF(Windows Presentation Foundation,视窗展示基础),它统一了桌面和浏览器等客户端应用程序的图形界面,基于DirectX和.NET框架,采用声明式XAML进行界面设计,是Windows的下

23、一代GUI显示系统。XAML(eXtensible Application Markup Language,可扩展应用程序标记语言)是一种基于XML(eXtensible Markup Language,可扩展标记语言,一种由万维网协会定义的通用数据描述语言)的用户界面标记语言,用于定义UI元素、数据绑定、事件和其他特性。4、 源程序package javaapplication1; import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import java.awt.image.BufferedImage;impor

24、t java.io.*;import java.util.ArrayList;import javax.swing.*;import javax.swing.filechooser.FileNameExtensionFilter;public class Main public static void main(String args) JFrame f=new JFrame(); f.setDefaultCloseOperation(3); f.setSize(880,600); f.setLocationRelativeTo(null); f.getContentPane().add(M.

25、c); f.getContentPane().add(M.m,"South"); f.setVisible(true); class CVS extends Component implements ComponentListener,MouseListener,MouseMotionListener public void componentHidden(ComponentEvent e) public void componentMoved(ComponentEvent e) public void componentResized(ComponentEvent e)

26、resized(); public void componentShown(ComponentEvent e) private void resized() int w=this.getWidth(); int h=this.getHeight(); tbuff=new BufferedImage(w,h,3); makeBuff(w,h); private void makeBuff(int w,int h) Graphics g = tbuff.getGraphics(); g.drawImage(buff,0,0,null); g.dispose(); buff=new Buffered

27、Image(w,h,3); g=buff.getGraphics(); g.drawImage(tbuff,0,0,null); g.dispose(); BufferedImage buff,tbuff; CVS() this.addComponentListener(this);this.addMouseListener(this); this.addMouseMotionListener(this); buff=new BufferedImage(1,1,3); public void paint(Graphics gr) Graphics2D g = buff.createGraphi

28、cs(); g.setBackground(new Color(0xff000000,true); g.clearRect(0,0,getWidth(),getHeight(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); M.sa.drawAll(g); if(M.ts!=null) M.ts.draw(g); g.dispose(); gr.drawImage(buff,0,0,this); gr.dispose(); public void mouseCli

29、cked(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mousePressed(MouseEvent e) M.mp(e.getPoint(); public void mouseReleased(MouseEvent e) M.mr(e.getPoint(); public void mouseDragged(MouseEvent e) M.md(e.getPoint(); public void mouseMoved(MouseE

30、vent e) class Menu extends JComponent implements MouseListener,ActionListener JComboBox sbox,method; CLabel cl; JCheckBox fillC,drawB; JRadioButton fc,bc; ButtonGroup bg;JButton clear,up,down,save,load; Menu() this.setLayout(new FlowLayout(); method=new JComboBox(new Object"draw","mov

31、e","erase",);add(method); sbox=new JComboBox(new Object"Pt","Ln","Rect","Cir","Arc",); add(sbox); cl=new CLabel13; for(int i=0; i<cl.length; i+) cli=new CLabel();cli.addMouseListener(this);add(cli); fc=new JRadioButton("fc"

32、;,true); bc=new JRadioButton("bc"); bg=new ButtonGroup(); bg.add(fc);bg.add(bc); add(fc);add(bc);fc.setOpaque(true); bc.setOpaque(true); fc.setBackground(Color.white); bc.setBackground(Color.blue); fillC=new JCheckBox("Fill",true); drawB=new JCheckBox("Draw",true); fill

33、C.addActionListener(this); drawB.addActionListener(this); add(fillC);add(drawB);clear=new JButton("clear"); clear.addActionListener(this); add(clear); up=new JButton("zUp");up.addActionListener(this); add(up); down=new JButton("zDown");down.addActionListener(this);add(d

34、own); save=new JButton("Save");save.addActionListener(this); add(save); load=new JButton("Load");load.addActionListener(this);add(load); public void mouseClicked(MouseEvent e) JLabel l=(JLabel)e.getSource(); if(e.getClickCount()=2) Color sc=JColorChooser.showDialog(null, "Co

35、lor chooser", l.getBackground(); l.setBackground(sc); mousePressed(e); public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mousePressed(MouseEvent e) Color c=(JLabel)e.getSource().getBackground(); if(fc.isSelected() fc.setBackground(c); Else if(bc.isSelected

36、() bc.setBackground(c); M.cp(); public void mouseReleased(MouseEvent e) public void actionPerformed(ActionEvent e) if(e.getSource()=clear)M.clear(); else if(e.getSource()=up)M.up(); else if(e.getSource()=down)M.down(); else if(e.getSource()=save)M.save(); else if(e.getSource()=load)M.load(); else if

37、(e.getSource()=fillC|e.getSource()=drawB)M.cp(); class CLabel extends JLabel static Color cs=Color.red,Color.orange,Color.yellow,Color.green,Color.cyan, Color.blue,Color.magenta,Color.magenta.brighter(), Color.white,Color.black,Color.gray,Color.LIGHT_GRAY,Color.DARK_GRAY,; static int i; CLabel() thi

38、s.setOpaque(true);this.setBackground(csi+); this.setBorder(BorderFactory.createLineBorder(Color.black); this.setPreferredSize(new Dimension(10,20); class M static JFileChooser jfc=new JFileChooser();static Menu m=new Menu(); static CVS c=new CVS(); static SA sa=new SA(); static S ts=null,selected=nu

39、ll; static Color fc,bc; static void clear() sa.ss.clear(); c.repaint(); public static void cp() System.out.println(selected); if(selected!=null) selected.fillColor=m.fc.getBackground(); selected.borderColor=m.bc.getBackground(); selected.fc=m.fillC.isSelected();selected.db=m.drawB.isSelected(); c.re

40、paint(); public static void up() if(selected!=null) sa.upZ(selected);c.repaint(); public static void down() if(selected!=null) sa.downZ(selected); c.repaint(); static jfc.setFileFilter(new FileNameExtensionFilter("JDraw file (*.jdraw,*.jdr)","jdr","jdraw"); static void

41、save() int x=jfc.showSaveDialog(c); if(x=JFileChooser.APPROVE_OPTION) File f = jfc.getSelectedFile(); try ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(f); oos.writeObject(sa); oos.flush(); oos.close(); catch(Exception e) static void load() int x=jfc.showOpenDialog(c); if(x=JFil

42、eChooser.APPROVE_OPTION) File f = jfc.getSelectedFile(); try ObjectInputStream oos=new ObjectInputStream(new FileInputStream(f); Object r=oos.readObject(); if(r!=null) sa=(SA)r;c.repaint(); oos.close(); catch(Exception e) e.printStackTrace(); static int mx,my,tx,ty,ox,oy;static int pc=0,pmax;static

43、int sm; static boolean ne=true;static int mid; static void mp(Point p) mid=m.method.getSelectedIndex(); if(mid=0) if(ne) mx=p.x;my=p.y; pc=0;sm=m.sbox.getSelectedIndex(); pmax=sm=4?2:1; ne=false; +pc; else if(mid=1) checkSel(p); mx=p.x;my=p.y; else if(mid=2) checkSel(p); if(selected!=null) sa.ss.rem

44、ove(selected); c.repaint(); private static void checkSel(Point p) selected=null; for(int i=sa.ss.size();i>0; i-) if(sa.ss.get(i-1).shape.contains(p) selected=sa.ss.get(i-1);break; sa.select(selected);c.repaint(); static void mt() Shape s=null; int cx,cy,cw,ch; switch(sm) case 0: case 2: cx=Math.m

45、in(mx,tx); cy=Math.min(my,ty); cw=Math.abs(mx-tx); ch=Math.abs(my-ty); if(sm=0) s=new Ellipse2D.Double(cx,cy,cw,ch); Else s=new Rectangle(cx,cy,cw,ch);break; case 1: s=new Line2D.Float(mx,my,tx,ty); break; case 3: cw=Math.abs(mx-tx);ch=Math.abs(my-ty); int cd=(int)Math.sqrt(Math.pow(mx-tx,2)+Math.po

46、w(my-ty,2)*2; cx=mx-cd/2;cy=my-cd/2; s=new Ellipse2D.Double(cx,cy,cd,cd);break; case 4: Path2D p=new Path2D.Double();p.moveTo(mx,my); if(pc=1) p.lineTo(tx, ty); Else p.quadTo(ox,oy,tx,ty); s=p; break; ts=new S(s,m.fc.getBackground(),m.bc.getBackground(),m.fillC.isSelected(),m.drawB.isSelected(),null

47、); c.repaint(); static void md(Point p) if(mid=0) if(!sa.ss.isEmpty() sa.ss.get(sa.ss.size()-1).sel=false; if(pc>1) ox=p.x;oy=p.y; Else tx=p.x;ty=p.y; mt(); else if(mid=1) if(selected!=null) moveTo(selected,p); c.repaint(); else if(mid=2) checkSel(p); if(selected!=null) sa.ss.remove(selected);c.repaint(); static void moveTo(S s, Point p) if(s.shape instanceof Rectangle) Rectangle r=(Rectangle)s.shape; r.s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论