Tab3.cpp
上传用户:tianjwyx
上传日期:2007-01-13
资源大小:813k
文件大小:14k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. // Tab3.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OSDemo.h"
  5. #include "Tab3.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CTab3 dialog
  13. CTab3::CTab3(CWnd* pParent /*=NULL*/)
  14. : CDialog(CTab3::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CTab3)
  17. //}}AFX_DATA_INIT
  18. }
  19. void CTab3::DoDataExchange(CDataExchange* pDX)
  20. {
  21. CDialog::DoDataExchange(pDX);
  22. //{{AFX_DATA_MAP(CTab3)
  23. DDX_Control(pDX, IDC_LCD, m_lcd);
  24. DDX_Control(pDX, IDC_TAB_VIEW, m_TabView);
  25. DDX_Control(pDX, IDC_TREE, m_wndTree);
  26. DDX_Control(pDX, IDC_SERIAL, m_List);
  27. //}}AFX_DATA_MAP
  28. }
  29. BEGIN_MESSAGE_MAP(CTab3, CDialog)
  30. //{{AFX_MSG_MAP(CTab3)
  31. ON_BN_CLICKED(IDC_BTN_BEGIN, OnBtnBegin)
  32. ON_WM_PAINT()
  33. ON_NOTIFY(NM_DBLCLK, IDC_TREE, OnDblclkTree)
  34. ON_WM_CONTEXTMENU()
  35. ON_COMMAND(IDR_MNU_REDO2, OnMnuRedo2)
  36. //}}AFX_MSG_MAP
  37. END_MESSAGE_MAP()
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CTab3 message handlers
  40. BOOL CTab3::OnInitDialog() 
  41. {
  42. CDialog::OnInitDialog();
  43.     ListView_SetExtendedListViewStyle(m_List.m_hWnd, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
  44. //m_List.SetBkColor(RGB(0,0,0));
  45. //m_List.SetTextColor(RGB(255,207,156));
  46. m_List.InsertColumn(0,"页号",LVCFMT_LEFT,40);
  47. m_List.InsertColumn(1,"FIFO",LVCFMT_CENTER,40);
  48. m_List.InsertColumn(2,"OPT",LVCFMT_CENTER,40);
  49. m_List.InsertColumn(3,"LRU",LVCFMT_CENTER,40);
  50. m_TabView.AddPage("平均命中图", &TabPage1, IDD_TAB_PAGE1);
  51. m_TabView.AddPage("具体情况图", &TabPage2, IDD_TAB_PAGE2);
  52. m_TabView.Show();
  53.     HTREEITEM  Root = m_wndTree.InsertItem ( _T("请求页式管理"),0,1 );
  54.     HTREEITEM  hti1 = m_wndTree.InsertItem ( _T("请双击'开始测试'按钮"),0,1,Root );
  55. m_wndTree.Expand(Root,TVE_EXPAND);
  56.     m_lcd.SetNumberOfLines(5);
  57. m_lcd.SetXCharsPerLine(18);
  58. m_lcd.SetSize(CMatrixStatic::TINY);
  59.     m_lcd.SetDisplayColors(RGB(165, 181, 66), RGB(0, 0, 0), RGB(148, 156, 66));
  60. m_lcd.AdjustClientXToSize(18);
  61. m_lcd.AdjustClientYToSize(5);
  62. m_lcd.SetText(_T(" PROGRAM MADE BY                           WUJUN                              9800134                            SouthEast         University                     "));
  63. m_lcd.DoScroll(1000, CMatrixStatic::UP);
  64.     UpdateData(false);
  65. return TRUE;  // return TRUE unless you set the focus to a control
  66.               // EXCEPTION: OCX Property Pages should return FALSE
  67. }
  68. float CTab3::rnd()
  69. {
  70. float n;
  71. n=rand()/(float)32767;
  72.     return n;
  73. }
  74. void CTab3::OnBtnBegin() 
  75. {
  76.       ((CButton*)GetDlgItem(IDC_BTN_BEGIN))->SetWindowText("重 做 实 验?  @_@");
  77.   InitMem();
  78.   int i,j,k;
  79.   bool bFIFO=false,bOPT=false,bLRU=false;
  80.       for (int n=0;n<4;n++)  //虚存容量分别为1k、2k、4k、8k。
  81.   {
  82.   for (j=0;j<VPageItem[n].VMemItem.GetSize();j++)     //当虚存页面容量一定(1k-8k),遍历所有可能的物理内存页面数
  83.   {
  84.   InitMemStack();
  85.    for (i=0;i<20;i++)  //当虚存容量和物理页面数一定,遍历访问序列数组
  86.    {
  87.                    //MessageBox("FIFO");
  88.    for (k=0;k<FIFOStack.GetSize();k++) //扫描FIFO看是否命中。
  89.    {
  90.  if (VPageItem[n].VMemItem[j].Serial[i].PageID==FIFOStack[k].PageID)
  91.  {
  92.    VPageItem[n].VMemItem[j].Serial[i].bFIFO=true;
  93.                        VPageItem[n].VMemItem[j].FIFORate+=5;
  94.    FIFOStack[k].UseTime=i;    //记录使用时间为第j个访问序列
  95.    bFIFO=true;
  96.  }
  97.    }
  98.       if (!bFIFO)                //fifo没有命中,且内存物理页面数已到最大。置换最先进入的页面。
  99.   {                          //如果内存物理页面数未到最大,就增加一个页面
  100. VPageItem[n].VMemItem[j].Serial[i].bFIFO=false;
  101. if(FIFOStack.GetSize()>=VPageItem[n].VMemItem[j].PageSize)
  102.      FIFOStack.RemoveAt(0);  //删掉最先进入的页面
  103. MEMSTACK newStack1;
  104. newStack1.PageID=VPageItem[n].VMemItem[j].Serial[i].PageID;
  105. newStack1.UseTime=i;
  106. FIFOStack.Add(newStack1);  //加入刚刚访问到的页面
  107.   }
  108.       bFIFO=false;
  109.   //MessageBox("OPT");
  110.    for (k=0;k<OPTStack.GetSize();k++) //扫描OPT看是否命中。
  111.    {
  112.  if (VPageItem[n].VMemItem[j].Serial[i].PageID==OPTStack[k].PageID)
  113.  {
  114.    VPageItem[n].VMemItem[j].Serial[i].bOPT=true;
  115.                        VPageItem[n].VMemItem[j].OPTRate+=5;
  116.    OPTStack[k].UseTime=i;
  117.    OPTStack[k].NextSame=VPageItem[n].VMemItem[j].Serial[i].NextSame;//记录使用时间为第j个访问序列
  118.    bOPT=true;
  119.  }
  120.    }
  121.       if (!bOPT)                //OPT没有命中,且内存物理页面数已到最大。置换最先进入的页面。
  122.   {                          //如果内存物理页面数未到最大,就增加一个页面
  123. int maxTime,DelPos;
  124. DelPos=0;
  125. VPageItem[n].VMemItem[j].Serial[i].bOPT=false;
  126. if(OPTStack.GetSize()>=VPageItem[n].VMemItem[j].PageSize)
  127. {
  128. maxTime=OPTStack[0].NextSame;
  129.   for (int x=0;x<OPTStack.GetSize();x++)
  130.   {
  131.                            if (OPTStack[x].NextSame>=maxTime)
  132.    {
  133.    maxTime=OPTStack[x].NextSame;
  134.    DelPos=x;
  135.    }
  136.   }
  137.   OPTStack.RemoveAt(DelPos);
  138. }//OPTStack.RemoveAt(0);  //删掉最先进入的页面
  139. MEMSTACK newStack2;
  140. newStack2.PageID=VPageItem[n].VMemItem[j].Serial[i].PageID;
  141. newStack2.UseTime=i;
  142. newStack2.NextSame=VPageItem[n].VMemItem[j].Serial[i].NextSame;
  143. OPTStack.Add(newStack2);  //加入刚刚访问到的页面
  144.   }
  145.       bOPT=false;
  146.   for (k=0;k<LRUStack.GetSize();k++) //扫描LRU看是否命中。
  147.   {
  148.    if (VPageItem[n].VMemItem[j].Serial[i].PageID==LRUStack[k].PageID)
  149.  {
  150.    VPageItem[n].VMemItem[j].Serial[i].bLRU=true;
  151.    VPageItem[n].VMemItem[j].LRURate+=5;
  152.    LRUStack[k].UseTime=i;    //记录使用时间为第j个访问序列
  153.    bLRU=true;
  154.  }
  155.   }
  156.       if (!bLRU)                //LRU没有命中,且内存物理页面数已到最大。置换时间最长的页面。
  157.   {                          //如果内存物理页面数未到最大,就增加一个页面
  158.   VPageItem[n].VMemItem[j].Serial[i].bLRU=false;
  159.   if(LRUStack.GetSize()>=VPageItem[n].VMemItem[j].PageSize)
  160.   {
  161. int minTime,RemovePos;
  162. RemovePos=0;
  163. minTime=LRUStack[0].UseTime;
  164. for(int x=0;x<LRUStack.GetSize();x++)
  165. {
  166.   if(LRUStack[x].UseTime<=minTime)
  167.   {
  168.   minTime=LRUStack[x].UseTime;
  169.   RemovePos=x;
  170.   }
  171. }
  172.   LRUStack.RemoveAt(RemovePos);  //删掉最久没有使用的页面
  173.   }
  174.   MEMSTACK newStack3;
  175.       newStack3.PageID=VPageItem[n].VMemItem[j].Serial[i].PageID;
  176.   newStack3.UseTime=i;
  177.   LRUStack.Add(newStack3);  //加入刚刚访问到的页面
  178.   }
  179.       bLRU=false; 
  180.    }
  181.    VPageItem[n].AveFIFORate+=VPageItem[n].VMemItem[j].FIFORate/VPageItem[n].VMemItem.GetSize();
  182.    VPageItem[n].AveOPTRate+=VPageItem[n].VMemItem[j].OPTRate/VPageItem[n].VMemItem.GetSize();
  183.    VPageItem[n].AveLRURate+=VPageItem[n].VMemItem[j].LRURate/VPageItem[n].VMemItem.GetSize();
  184.   }
  185.   }
  186.   ShowMemList(2,0);
  187.   ShowGraph1();
  188.   m_TabView.SetCurSel(0);
  189.   CRect rect;
  190.       ((CButton*)GetDlgItem(IDC_TREE))->GetWindowRect(&rect);
  191.       CPoint pt;
  192.   pt.x=180;
  193.   pt.y=150;
  194.       ShowBallTip(pt,"展开并单击项目查看详细命中情况");
  195. }
  196. void CTab3::AddPageItem(CString PageID, CString FIFO, CString OPT, CString LRU)
  197. {
  198.      
  199.     LVITEM lvitem;
  200. int iActualItem;
  201. for(int iSubItem=0;iSubItem<6;iSubItem++)
  202. {
  203. lvitem.mask = LVIF_TEXT|(iSubItem == 0? LVIF_IMAGE : 0);
  204. lvitem.iItem = (iSubItem == 0)? ++PageCount : iActualItem;
  205. lvitem.iSubItem = iSubItem;
  206. CString CurTime;
  207. switch(iSubItem)
  208. {
  209. case 0:
  210. lvitem.pszText =(LPTSTR)(LPCTSTR)PageID;
  211. break;
  212. case 1:
  213.     lvitem.pszText =(LPTSTR)(LPCTSTR)FIFO;
  214. break;
  215.         case 2:
  216.     lvitem.pszText =(LPTSTR)(LPCTSTR)OPT;
  217. break;
  218.         case 3:
  219.     lvitem.pszText =(LPTSTR)(LPCTSTR)LRU;
  220. break;
  221. if (iSubItem == 0)
  222. iActualItem = m_List.InsertItem(&lvitem);
  223. else
  224. m_List.SetItem(&lvitem);
  225. }
  226. }
  227. void CTab3::OnPaint() 
  228. {
  229. CPaintDC dc(this); // device context for painting
  230. // Do not call CDialog::OnPaint() for painting messages
  231. }
  232. void CTab3::InitMem()
  233. {
  234.  int n,i,j,k;
  235.      CStatic a;
  236.  ::ZeroMemory(VPageItem,sizeof(VPageItem));
  237.      TabPage1.bDraw=false;
  238.  
  239.  CString CurRnd,CurChar;
  240.  m_wndTree.DeleteAllItems();
  241.  HTREEITEM  Root = m_wndTree.InsertItem ( _T("随机访问序列实验结果"),0,1 );
  242.  for (n=0;n<4;n++)
  243.  {
  244.  int maxPage=32/(int)pow(2,n);
  245.  VPageItem[n].vPageSize=(int)pow(2,n);
  246.  VPageItem[n].AveFIFORate=0;
  247.  VPageItem[n].AveLRURate=0;
  248.  VPageItem[n].AveOPTRate=0;
  249.  CString NodeStr;
  250.  NodeStr.Format("页面大小为%dK",VPageItem[n].vPageSize);
  251.  VPageItem[n].hti=m_wndTree.InsertItem ( NodeStr,0,1,Root );
  252.  srand((unsigned)::GetTickCount());
  253.  for (i=4;i<=maxPage;i++)
  254.  {
  255.  MEMITEM newItem;
  256.  newItem.PageSize=i;
  257.  newItem.FIFORate=0;
  258.  newItem.OPTRate=0;
  259.  newItem.LRURate=0;
  260.  NodeStr.Format("物理内存块分%d页",i);
  261.              newItem.hti=m_wndTree.InsertItem ( NodeStr,0,1,VPageItem[n].hti);
  262.  
  263.  for(j=0;j<20;j++)                          //生成20个随机访问序列
  264.  {
  265. newItem.PageSize=i;
  266. newItem.Serial[j].bFIFO=false;
  267. newItem.Serial[j].bOPT=false;
  268. newItem.Serial[j].bLRU=false;
  269.     
  270.     newItem.Serial[j].PageID=(UINT)((float)maxPage*rnd());
  271.              }
  272.              for(j=0;j<20;j++)                           //得到序列中和本页面号相同的下一序列的下标号
  273.  {
  274.                 k=j+1;
  275.    while(newItem.Serial[j].PageID!=newItem.Serial[k].PageID && k<20)
  276.                 {   k++;}
  277. if(k>=20)
  278. newItem.Serial[j].NextSame=100;
  279. else
  280. newItem.Serial[j].NextSame=k;
  281.  }
  282.              VPageItem[n].VMemItem.Add(newItem);
  283.  }
  284.  }
  285.  m_wndTree.Expand(Root,TVE_EXPAND);
  286.  
  287. }
  288. void CTab3::ShowMemList(int nPage,int nMem)
  289. {
  290.     m_List.DeleteAllItems();
  291. CString strPageID;
  292. CString Check1;
  293. CString Check2;
  294. CString Check3;
  295. for(int i=0;i<20;i++)
  296. {
  297.         strPageID.Format("%d",VPageItem[nPage].VMemItem[nMem].Serial[i].PageID);
  298. if (VPageItem[nPage].VMemItem[nMem].Serial[i].bFIFO) Check1="√";
  299. else                 Check1="×";
  300. if (VPageItem[nPage].VMemItem[nMem].Serial[i].bOPT)  Check2="√";
  301. else                 Check2="×";
  302. if (VPageItem[nPage].VMemItem[nMem].Serial[i].bLRU)  Check3="√";
  303. else                 Check3="×";
  304. AddPageItem(strPageID,Check1,Check2,Check3);
  305. }
  306. }
  307. void CTab3::InitMemStack()
  308. {
  309.      FIFOStack.RemoveAll();
  310.  LRUStack.RemoveAll();
  311.  OPTStack.RemoveAll();
  312. }
  313. void CTab3::ShowGraph1()
  314. {
  315.    for(int n=0;n<4;n++)
  316.    {
  317.    TabPage1.potOPT[n].rate=(int)VPageItem[n].AveOPTRate; 
  318.    TabPage1.potFIFO[n].rate=(int)VPageItem[n].AveFIFORate;
  319.        TabPage1.potLRU[n].rate=(int)VPageItem[n].AveLRURate;
  320.  
  321.    }
  322.     TabPage1.m_Draw.ShowWindow(SW_HIDE);
  323. TabPage1.m_Draw.ShowWindow(SW_SHOW);
  324.     TabPage1.DrawBar();
  325. TabPage1.bDraw=true;
  326. }
  327. void CTab3::OnDblclkTree(NMHDR* pNMHDR, LRESULT* pResult) 
  328. {
  329.     int i,j;
  330.    for (i=0;i<4;i++)
  331.    {
  332.    for (j=0;j<VPageItem[i].VMemItem.GetSize();j++)
  333.    {
  334.    if (m_wndTree.GetSelectedItem()==VPageItem[i].VMemItem[j].hti)
  335.    {
  336.    ShowMemList(i,j);
  337.    ShowGraph2(i);
  338.    m_lcd.StopScroll();
  339.                CString disp;
  340.    disp.Format("PAGESIZE=%2dKB     MEM PAGENUM= %2d    FIFO HitRate;%2d%%   OPT HitRate;%2d%%   LRU HitRate;%2d%%       ",VPageItem[i].VMemItem[j].PageSize,VPageItem[i].VMemItem.GetSize(),(int)VPageItem[i].VMemItem[j].FIFORate,(int)VPageItem[i].VMemItem[j].OPTRate,(int)VPageItem[i].VMemItem[j].LRURate);
  341.                m_lcd.SetText(disp);
  342.    m_TabView.SetCurSel(1);
  343.    }
  344.    }
  345.    }
  346.   
  347.   //
  348.    *pResult = 0;
  349. }
  350. void CTab3::ShowGraph2(int nPage)
  351. {
  352.     int j;
  353. TabPage1.bDraw=false;
  354. TabPage2.bDraw=false;
  355. if (m_TabView.GetCurSel()==0)
  356. {
  357. TabPage1.ShowWindow(SW_HIDE);
  358. TabPage1.ShowWindow(SW_SHOW);
  359. }
  360. else
  361. {
  362. TabPage2.ShowWindow(SW_HIDE);
  363. TabPage2.ShowWindow(SW_SHOW);
  364. }
  365.     TabPage2.potFIFO.RemoveAll();
  366. TabPage2.potOPT.RemoveAll();
  367. TabPage2.potLRU.RemoveAll();
  368. TabPage1.bDraw=true;
  369.     TabPage2.bDraw=true;
  370. for(j=0;j<VPageItem[nPage].VMemItem.GetSize();j++)
  371. {
  372.             POTS FIFOPot,OPTPot,LRUPot;
  373. FIFOPot.rate=(int)VPageItem[nPage].VMemItem[j].FIFORate;
  374.             OPTPot.rate=(int)VPageItem[nPage].VMemItem[j].OPTRate;
  375. LRUPot.rate=(int)VPageItem[nPage].VMemItem[j].LRURate;
  376. TabPage2.potFIFO.Add(FIFOPot);
  377. TabPage2.potOPT.Add(OPTPot);
  378. TabPage2.potLRU.Add(LRUPot);
  379. }
  380.     TabPage2.Draw3dLine();
  381. }
  382. void CTab3::OnContextMenu(CWnd* pWnd, CPoint point) 
  383. {
  384.        if (point.x == -1 && point.y == -1){
  385. //keystroke invocation
  386. CRect rect;
  387. GetClientRect(rect);
  388. ClientToScreen(rect);
  389. point = rect.TopLeft();
  390. point.Offset(5, 5);
  391. }
  392. CMenu menu;
  393. VERIFY(menu.LoadMenu(IDR_POP_MNU2));
  394. CMenu* pPopup = menu.GetSubMenu(0);
  395. ASSERT(pPopup != NULL);
  396. CWnd* pWndPopupOwner = this;
  397. //while (pWndPopupOwner->GetStyle() & WS_CHILD)
  398. // pWndPopupOwner = pWndPopupOwner->GetParent();
  399. TrackSkinPopupMenu( pPopup->m_hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  400. pWndPopupOwner->m_hWnd );
  401. }
  402. void CTab3::OnMnuRedo2() 
  403. {
  404.     OnBtnBegin();
  405. }
  406. void CTab3::ShowBallTip(CPoint pt, CString msg)
  407. {
  408.         LOGFONT lf;
  409.         ::ZeroMemory (&lf, sizeof (lf));
  410.         lf.lfHeight = 15;
  411.         lf.lfWeight = FW_BOLD;
  412.         lf.lfUnderline = FALSE;
  413.         ::strcpy (lf.lfFaceName, _T("楷体_GB2312"));
  414.         
  415.         // Get the edit box co-ordinates in screen co-ordinates
  416.         //CRect rect;
  417.         //((CStatic*)hwnd)->GetWindowRect(&rect);
  418.         // Point where the balloon will be show, middle of edit box
  419.         //CPoint pt = rect.CenterPoint();
  420.         
  421.         m_pBalloonTip = CBalloonTip::Show(pt, CSize(250, 100), msg, lf, 5, TRUE);
  422. }