FIFO页面置换算法

合集下载

详解页式管理置换算法FIFO_LRU_OPT

详解页式管理置换算法FIFO_LRU_OPT

页式管理OPT、LRU、FIFO置换算法详解指令:1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6若内存最多容纳4个页面,则……一、OPT(理想型淘汰)算法该算法无法实现。

置换规则:(1)淘汰内存中以后不再访问的页面;(2)如果没有(1),则淘汰将要访问指令之后的将来最迟被访问的指令的页面。

分析:(1)当访问5时,内存1,2,3,4,发生第5次中断,淘汰不再访问的4,换入5,内存1,2,3,5;(2)当访问6时,内存1,2,3,5,发生第6次中断,淘汰不再访问的5,换入6,内存1,2,3,6;(3)当访问7时,内存1,2,3,6,发生第7次中断,由于之后的指令(1、2、3、6)都是现在内存页面都存在的指令,无法淘汰,但可以根据指令访问顺序,先淘汰将来最迟被访问的1,换入7,置换后的内存7,2,3,6;(4)当访问1时,内存7,2,3,6,发生第8次中断,淘汰不再访问的7,换入1,内存1,2,3,6;即OPT算法一共会出现8次缺页中断。

二、LRU(最近最久未使用)算法该算法利用堆栈实现,每次访问都调整堆栈中页面顺序。

把被访问页面从栈移出再压入栈顶。

置换规则:(1)栈顶始终为最新访问过的页面;(2)栈底始终为最近最久未被访问的页面;(3)访问存在的页面要调到栈顶。

分析:(1)访问第5个指令2时,由于内存页面中已经存在2,所以不置换,但调整2在栈中顺序,即将2调到栈顶,其它页面依次后置。

调整前内存4,3,2,1,调整后内存2,4,3,1;(2)访问第7个指令5时,发生第5次中断,原内存1,2,4,3,淘汰栈底3,栈顶调入5,调整后内存5,1,2,4;(3)访问第8个指令6时,发生第6次中断,原内存5,1,2,4,,淘汰栈底4,栈顶调入6,调整后内存6,5,1,2;……即LRU算法一共会出现10次缺页中断。

三、FIFO(先进先出)算法该算法利用队列实现。

FIFO与LRU的区别是FIFO遇到内存中存在的页面不需要调换页面顺序。

FIFO页面置换算法

FIFO页面置换算法

FIFO 页面置换算法什么是页面置换算法?在操作系统中,进程需要使用内存来进行运行。

但是内存并不是无限的,所以操作系统需要管理内存的分配和释放。

当进程需要使用内存时,操作系统会将必要的数据和指令从硬盘上加载到内存中。

但是当内存被占满时,操作系统需要使用一种称为“页面置换算法”的技术来更好地管理内存。

页面置换算法的主要作用是在内存占满的情况下将最少使用的页面(或者是内存块)替换出去,以便其他进程可以使用内存。

页面置换算法是现代操作系统中非常重要的一部分。

什么是FIFO页面置换算法?FIFO是一种古老的页面置换算法,也是最简单的一种页面置换算法之一。

FIFO的全称是First In First Out,中文名叫做先进先出算法。

FIFO算法的核心思想是,先进入内存的页面(或内存块)是最先被替换出去的。

这就好比是一个排队等车的现象,先来的人先上车,后来的人只能等待。

FIFO页面置换算法的工作原理数据结构FIFO算法依赖于一个叫做FIFO队列的数据结构。

FIFO队列是一种先进先出的队列。

当一个页面进入内存时,它就被加入到FIFO队列的队尾。

当需要替换页时,页表中列出的第一个页面就是队列的第一个(最早加入)页面,这个页面就是要替换出去的页面。

工作流程FIFO页面置换算法的工作流程可以分为以下几个步骤:1.算法初始化。

在FIFO算法使用前,需要初始化一个FIFO队列来记录进入内存的各个页面的顺序。

2.操作系统请求内存。

当操作系统需要加载新的页面或内存块时,检查内存是否已经满了。

如果内存已满,则需要使用页面置换算法来选择要替换掉的页面。

3.根据FIFO队列来选择将要替换的页面。

从FIFO队列中选择最早加入的页面来替换。

这个页面就是队列中的第一个元素。

4.更新FIFO队列。

因为要替换掉一个页面,所以我们需要更新FIFO队列。

将新进入内存的页面加入到FIFO队列的队尾。

5.将替换出的页面写回到硬盘上。

在进行页面置换之前,需要将要替换出去的页面的数据写回到硬盘上。

页面置换常用的算法总结

页面置换常用的算法总结

页⾯置换常⽤的算法总结本⽂转载⾃:进程运⾏时,若其访问的页⾯不在内存⽽需将其调⼊,但内存已⽆空闲空间时,就需要从内存中调出⼀页程序或数据,送⼊磁盘的对换区。

选择调出页⾯的算法就称为页⾯置换算法。

好的页⾯置换算法应有较低的页⾯更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页⾯先调出。

常见的置换算法有以下四种。

1. 最佳置换算法(OPT)最佳(Optimal, OPT)置换算法所选择的被淘汰页⾯将是以后永不使⽤的,或者是在最长时间内不再被访问的页⾯,这样可以保证获得最低的缺页率。

但由于⼈们⽬前⽆法预知进程在内存下的若千页⾯中哪个是未来最长时间内不再被访问的,因⽽该算法⽆法实现。

最佳置换算法可以⽤来评价其他算法。

假定系统为某进程分配了三个物理块,并考虑有以下页⾯号引⽤串:7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1进程运⾏时,先将7, 0, 1三个页⾯依次装⼊内存。

进程要访问页⾯2时,产⽣缺页中断,根据最佳置换算法,选择第18次访问才需调⼊的页⾯7予以淘汰。

然后,访问页⾯0时,因为已在内存中所以不必产⽣缺页中断。

访问页⾯3时⼜会根据最佳置换算法将页⾯1淘汰……依此类推,如图3-26所⽰。

从图中可以看出⾤⽤最佳置换算法时的情况。

可以看到,发⽣缺页中断的次数为9,页⾯置换的次数为6。

访问页⾯70120304230321201701物理块1777222227物理块200004000物理块31133311缺页否√√ √√√√√√√图3-26 利⽤最佳置换算法时的置换图2. 先进先出(FIFO)页⾯置换算法优先淘汰最早进⼊内存的页⾯,亦即在内存中驻留时间最久的页⾯。

该算法实现简单,只需把调⼊内存的页⾯根据先后次序链接成队列,设置⼀个指针总指向最早的页⾯。

但该算法与进程实际运⾏时的规律不适应,因为在进程中,有的页⾯经常被访问。

【精品】页面置换算法实验报告

【精品】页面置换算法实验报告

【精品】页面置换算法实验报告一、实验目的了解操作系统中的页面置换算法,并实现FIFO、LRU和Clock算法。

二、实验原理页面置换算法是操作系统中用到的一种算法,其作用是在内存不够用时,选择牺牲已经在内存中的一些页,腾出更多的空间给新的内容。

本次实验主要实现了FIFO、LRU和Clock算法。

1、FIFO算法FIFO算法是最简单的页面置换算法,它采用先进先出的原则,即最先进入内存的页面应该最早被替换出去。

该算法的实现非常简单,只需要维护一个队列即可。

当需要置换页面时,选择队列的第一个页面进行替换即可。

2、LRU算法LRU算法是Least Recently Used的缩写,即最近最少使用算法。

该算法的核心思想是选择最久没有被使用的页面进行替换。

为了实现该算法,需要维护记录页面使用时间的链表、栈或队列等结构。

3、Clock算法Clock算法也叫做二次机会算法,是一种改良的FIFO算法。

它是基于FIFO算法的思想,并且每个页面都设置了一个使用位(use bit),用于记录该页面是否被使用过。

当需要置换一个页面时,检查该页面的使用位,如果该页面的使用位为1,则将该页面的使用位设置为0并移到队列的末尾,表示该页面有“二次机会”继续待在内存中;如果该页面的使用位为0,则选择该页面进行替换。

三、实验过程本次实验采用Python语言实现页面置换算法,并使用样例进行测试。

1、FIFO算法实现FIFO算法的实现非常简单,只需要用一个队列来维护已经在内存中的页面,当需要置换页面时,选择队列的第一个元素即可。

代码如下:```pythonfrom collections import dequeclass FIFO:def __init__(self, frame_num):self.frame_num = frame_numself.frames = deque(maxlen=frame_num)def access(self, page):if page in self.frames:return Falseif len(self.frames) >= self.frame_num:self.frames.popleft()self.frames.append(page)return True```2、LRU算法实现LRU算法的实现需要维护一个记录页面使用时间的链表或队列。

最佳页面置换算法

最佳页面置换算法

最佳页面置换算法(Optimal)(非常专业)评价一个算法的优劣,可通过在一个特定的存储访问序列(页面走向)上运行它,并计算缺页数量来实现。

1 先入先出法(FIFO)最简单的页面置换算法是先入先出(FIFO)法。

这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。

理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。

建立一个FIFO队列,收容所有在内存中的页。

被置换页面总是在队列头上进行。

当一个页面被放入内存时,就把它插在队尾上。

这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。

因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。

FIFO的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。

当然,导致这种异常现象的页面走向实际上是很少见的。

现在来看下4块的情况:0 1 2 3 2 1 3 2 5 2 3 6 2 1 4 2【解答】刚开始内存并没有这个作业,所以发生缺页中断一次。

作业的0号页进入内存。

(1次缺页中断)而页1又不在内存,又发生缺页中断一次。

作业页1进入内存。

(2次缺页中断) 页2不在内存,发生缺页中断。

页2进入内存。

(3次缺页中断)页3不在内存,发生缺页中断。

页3进入内存。

(4次缺页中断)接下来调入页2,页1,页3,页2。

由于都在内存中,并不发生缺页中断。

页5不在内存,发生缺页中断。

页5进入内存,页5置换页0。

(5次缺页中断) 接下来调入页2,页3。

由于都在内存中,并不发生缺页中断。

页6不在内存,发生缺页中断。

页6进入内存。

页6置换页1。

(6次缺页中断) 页2在内存,不发生缺页中断。

页1不在内存(在发生第6次缺页中断时被置换了),发生缺页中断。

页1进入内存,页2被置换。

(7次缺页中断)页4置换页3,页4进入内存。

(8次缺页中断)现在调入页2,但页2在发生第7次缺页中断时被置换掉了。

页面置换算法实验报告实验心得

页面置换算法实验报告实验心得

页面置换算法实验报告实验心得
在操作系统中,页面置换算法被广泛应用于内存管理中。

该算法的主要目的是对内存中的页面进行动态置换,以便系统可以最大限度地利用可用内存空间。

在本次实验中,我们掌握了几种常见的页面置换算法,如FIFO、LRU和OPT,并通过模拟测试了它们在不同工作负载下的性能。

对于FIFO算法,它是最简单和最基本的页面置换算法之一。

该算法通过维护一个页面队列,按照页面进入内存的顺序进行置换。

但是,FIFO算法没有考虑到页面的使用情况,即使一个页面被频繁访问也可能被置换。

因此,该算法的性能很容易受到工作负载的影响。

相比之下,LRU算法可以更好地利用页面使用模式。

该算法通过维护一个页面使用历史记录表,始终保留最近最少使用的页面,从而实现最优的页面置换。

但是,由于需要维护一个回收算法,因此LRU算法的性能较差。

最后,我们尝试了OPT算法,该算法是最优的页面置换算法。

该算法通过预测未来的页面使用情况,选择最久未被使用的页面进行置换。

理论上,OPT算法可以实现最少的页面置换,但是它需要在每个时间点都知道未来的页面使用情况,这对于实际应用来说是不可
行的。

总的来说,通过本次实验,我们深入了解了页面置换算法的本质和特点,并掌握了它们的实现方法和应用场景。

我们也意识到,在实际应用中,不同的页面置换算法可能具有不同的性能表现,需要根据具体的工作负载和系统特点来选择合适的算法。

页面置换算法

页面置换算法

页面置换算法2008-03-01 22:30评价一个算法的优劣,可通过在一个特定的存储访问序列(页面走向)上运行它,并计算缺页数量来实现。

1 先入先出法(FIFO)最简单的页面置换算法是先入先出(FIFO)法。

这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。

理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。

建立一个FIFO队列,收容所有在内存中的页。

被置换页面总是在队列头上进行。

当一个页面被放入内存时,就把它插在队尾上。

这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。

因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。

FIFO的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。

当然,导致这种异常现象的页面走向实际上是很少见的。

2 最优置换算法(OPT)最优置换(Optimal Replacement)是在理论上提出的一种算法。

其实质是:当调入新的一页而必须预先置换某个老页时,所选择的老页应是将来不再被使用,或者是在最远的将来才被访问。

采用这种页面置换算法,保证有最少的缺页率。

但是最优页面置换算法的实现是困难的,因为它需要人们预先就知道一个进程整个运行过程中页面走向的全部情况。

不过,这个算法可用来衡量(如通过模拟实验分析或理论分析)其他算法的优劣。

3 最久未使用算法(LRU)FIFO算法和OPT算法之间的主要差别是,FIFO算法利用页面进入内存后的时间长短作为置换依据,而OPT算法的依据是将来使用页面的时间。

如果以最近的过去作为不久将来的近似,那么就可以把过去最长一段时间里不曾被使用的页面置换掉。

它的实质是,当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以置换。

这种算法就称为最久未使用算法(Least Recently Used,LRU)。

常见的页面置换算法

常见的页面置换算法

常见的页面置换算法1.概述页面置换算法是操作系统中用于管理内存的一种算法,其目的是确保可用内存的最大化并实现对内存的高效使用。

在操作系统中,当进程所需的内存空间超出了可用的物理内存空间时,操作系统就需要从主存中选择一些页面腾出空间来装载进程所需的页面。

这就需要使用页面置换算法。

2.常见的页面置换算法2.1最优页面置换算法(OPT)最优页面置换算法是一种理论上的置换算法。

它的核心思想是通过计算进程未来访问各个页面的时间和距离,来推断出离当前时间最久的页面。

这种算法的优点是能够保证页面置换的最优性,但是它需要预先知道进程未来所有的页面调度情况,这在实际应用中是不可行的。

2.2先进先出(FIFO)置换算法先进先出置换算法是一种很简单的置换算法,它选取主存中驻留时间最长的页面作为替换目标。

优点是实现简单,但是缺点是可能会引发置换震荡问题。

2.3最近最久未使用算法(LRU)最近最久未使用算法是一种比较常用的页面置换算法,其核心思想是将驻留时间久且最近一次使用时间早的页面视为需要置换的页面。

相对于FIFO算法,LRU算法能够保证更高的页面命中率和更小的置换次数。

2.4时钟置换算法(Clock)时钟置换算法是一种改进型的FIFO算法。

该算法使用一个环形队列来存储主存中的页面位置信息。

当需要置换页面时,指针先指向队列首位置,遍历队列并且在第一遍扫描时,将页框的访问位ACC设置为0。

第一遍扫描结束后,如果有页面的ACC位为0,就将其替换出去。

如果找不到未访问页面,指针再回到队列首位置,以此类推,直到找到为止。

3.总结以上所述的几种页面置换算法是操作系统中常见的算法。

它们各有优点和缺点,在实际应用中,需要根据实际情况进行选择。

在选择算法后,还需要对其进行适当的调整,以满足实际需求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "stdafx.h"#include "test.h"#include "testDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifstruct SeqQueue *tier=NULL;BOOL flag;/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CTestDlg dialogCTestDlg::CTestDlg(CWnd* pParent /*=NULL*/): CDialog(CTestDlg::IDD, pParent){//{{AFX_DATA_INIT(CTestDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CTestDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CTestDlg)DDX_Control(pDX, IDC_BACK, m_back);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CTestDlg, CDialog)//{{AFX_MSG_MAP(CTestDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(ID_EXIT, OnExit)ON_COMMAND(ID_ABOUT, OnAbout)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_COMMAND(ID_RESTART, OnRestart)ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON4, OnButton4)ON_BN_CLICKED(IDC_BUTTON5, OnButton5)ON_BN_CLICKED(IDC_BUTTON6, OnButton6)ON_BN_CLICKED(IDC_BUTTON7, OnButton7)ON_BN_CLICKED(IDC_BUTTON8, OnButton8)ON_WM_SHOWWINDOW()ON_WM_TIMER()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CTestDlg message handlersvoid Permute(short int x){flag=true;for(int i=0;i<tier->rear;i++){if(x==tier->page[i]){flag=false;return;}}tier->ptr=(tier->ptr+1)%MAXNUM;tier->page[tier->front]=x;tier->front=(tier->front+1)%MAXNUM;tier->rear=tier->rear>MAXNUM?MAXNUM:tier->rear+1; }void CTestDlg::InitDemo(){for (int i=0;i<STNUM;i++){m_Static[i]->SetBitmap(HBITMAP(hBlt));}tier->front=0;tier->rear=0;tier->ptr=-1;flag=true;}BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetS ystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); }}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization hereMoveWindow(0,0,WIDTH+6,HEIGHT+44);CenterWindow();bitmap.LoadBitmap(IDB_BACK);GetDlgItem(IDC_BACK)->MoveWindow(0,0,640,480,TRUE);GetDlgItem(IDC_STATIC1)->MoveWindow(73,189,75,97,TRUE);m_Button[0]=(CButton*)GetDlgItem(IDC_BUTTON1);m_Button[1]=(CButton*)GetDlgItem(IDC_BUTTON2);m_Button[2]=(CButton*)GetDlgItem(IDC_BUTTON3);m_Button[3]=(CButton*)GetDlgItem(IDC_BUTTON4);m_Button[4]=(CButton*)GetDlgItem(IDC_BUTTON5);m_Button[5]=(CButton*)GetDlgItem(IDC_BUTTON6);m_Button[6]=(CButton*)GetDlgItem(IDC_BUTTON7);m_Button[7]=(CButton*)GetDlgItem(IDC_BUTTON8);m_Static[0]=(CStatic*)GetDlgItem(IDC_STATIC1);m_Static[1]=(CStatic*)GetDlgItem(IDC_STATIC2);m_Static[2]=(CStatic*)GetDlgItem(IDC_STATIC3);m_Static[3]=(CStatic*)GetDlgItem(IDC_STATIC4);m_Static[4]=(CStatic*)GetDlgItem(IDC_STATIC5);m_Static[5]=(CStatic*)GetDlgItem(IDC_STATIC6);m_Blt[0].LoadBitmap(IDB_BITMAP1);m_Blt[1].LoadBitmap(IDB_BITMAP2);m_Blt[2].LoadBitmap(IDB_BITMAP3);m_Blt[3].LoadBitmap(IDB_BITMAP4);m_Blt[4].LoadBitmap(IDB_BITMAP5);m_Blt[5].LoadBitmap(IDB_BITMAP6);m_Blt[6].LoadBitmap(IDB_BITMAP7);m_Blt[7].LoadBitmap(IDB_BITMAP8);hBlt = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP0)); int i;for (i=0;i<BTNUM;i++){m_Button[i]->MoveWindow(9+78*i,HEIGHT-120,75,97,TRUE);m_Button[i]->SetBitmap(HBITMAP(m_Blt[i]));}for (i=0;i<STNUM-1;i++){m_Static[i]->MoveWindow(76+102*i,(HEIGHT-120)/2,75,97,TRUE);}m_Static[i]->MoveWindow(WIDTH-100,20,75,97,TRUE);GetDlgItem(IDC_STATIC)->MoveWindow(WIDTH-113,120,100,20,TRUE);tier=(SeqQueue*)malloc(sizeof(struct SeqQueue));InitDemo();return TRUE; // return TRUE unless you set the focus to a control}void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CTestDlg::DrawBackdrop(){BITMAP bm;CDC *pDC=new CDC;CClientDC dc(&m_back);pDC->CreateCompatibleDC(&dc);pDC->SelectObject(bitmap);bitmap.GetObject(sizeof(BITMAP),&bm);dc.StretchBlt(0,0,640,480,pDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);delete pDC;}void CTestDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();DrawBackdrop();}}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR CTestDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CTestDlg::OnExit(){// TODO: Add your command handler code hereOnCancel();}void CTestDlg::OnCancel(){// TODO: Add your message handler code hereif( ::MessageBox(GetSafeHwnd(), "退出程序吗?","系统提示",MB_YESNO|MB_ICONQUESTION|M B_DEFBUTTON2 ) == IDYES ) {DeleteObject(hBlt);CDialog::OnCancel();}}void CTestDlg::OnAbout(){// TODO: Add your command handler code hereCAboutDlg dlg;dlg.DoModal();}void CTestDlg::OnRestart(){// TODO: Add your command handler code hereInitDemo();}void CTestDlg::SetImage(int n){Permute(n);if(flag){m_Static[tier->ptr]->SetBitmap(HBITMAP(m_Blt[n]));m_Static[STNUM-1]->SetBitmap(HBITMAP(m_Blt[n]));}else{m_Static[STNUM-1]->SetBitmap(HBITMAP(hBlt));}}void CTestDlg::OnButton1(){// TODO: Add your control notification handler code hereSetImage(0);}void CTestDlg::OnButton2(){// TODO: Add your control notification handler code hereSetImage(1);}void CTestDlg::OnButton3(){// TODO: Add your control notification handler code hereSetImage(2);}void CTestDlg::OnButton4(){// TODO: Add your control notification handler code hereSetImage(3);}void CTestDlg::OnButton5(){// TODO: Add your control notification handler code hereSetImage(4);}void CTestDlg::OnButton6(){// TODO: Add your control notification handler code hereSetImage(5);}void CTestDlg::OnButton7(){// TODO: Add your control notification handler code hereSetImage(6);}void CTestDlg::OnButton8(){// TODO: Add your control notification handler code hereSetImage(7);}void CTestDlg::OnShowWindow(BOOL bShow, UINT nStatus) {CDialog::OnShowWindow(bShow, nStatus);// TODO: Add your message handler code here}BOOL CTestDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext){// TODO: Add your specialized code here and/or call the base classreturn CDialog::Create(IDD, pParentWnd);}void CTestDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCDialog::OnTimer(nIDEvent);}// testDlg.h : header file//#if !defined(AFX_TESTDLG_H__BC831C21_F558_4681_8EA8_512BDD43AAA8__INCLUDED_)#define AFX_TESTDLG_H__BC831C21_F558_4681_8EA8_512BDD43AAA8__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define WIDTH 640#define HEIGHT 480#define BTNUM 8#define STNUM 6#define MAXNUM 5struct SeqQueue{short int page[MAXNUM];int ptr;int front,rear;};/////////////////////////////////////////////////////////////////////////////// CTestDlg dialogclass CTestDlg : public CDialog{// Constructionpublic:CTestDlg(CWnd* pParent = NULL); // standard constructorCBitmap bitmap;CStatic* m_Static[STNUM];CButton* m_Button[BTNUM];HBITMAP hBlt;CBitmap m_Blt[BTNUM];// Dialog Data//{{AFX_DATA(CTestDlg)enum { IDD = IDD_TEST_DIALOG };CStatic m_back;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CTestDlg)public:virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const R ECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:void DrawBackdrop();void InitDemo();void SetImage(int n);HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CTestDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnExit();virtual void OnCancel();afx_msg void OnAbout();afx_msg void OnButton1();afx_msg void OnButton2();afx_msg void OnRestart();afx_msg void OnButton3();afx_msg void OnButton4();afx_msg void OnButton5();afx_msg void OnButton6();afx_msg void OnButton7();afx_msg void OnButton8();afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);afx_msg void OnTimer(UINT nIDEvent);//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_TESTDLG_H__BC831C21_F558_4681_8EA8_512BDD43AAA8__INCLUDED_)Trac kback: /TrackBack.aspx?PostId=377566。

相关文档
最新文档