MemoryDlg.cpp
上传用户:wzi6060
上传日期:2022-06-22
资源大小:130k
文件大小:10k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. // MemoryDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "Memory.h"
  5. #include "MemoryDlg.h"
  6. #include <cstdlib>
  7. #include <time.h>
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #endif
  11. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  12. class CAboutDlg : public CDialog
  13. {
  14. public:
  15. CAboutDlg();
  16. // 对话框数据
  17. enum { IDD = IDD_ABOUTBOX };
  18. protected:
  19. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
  20. // 实现
  21. protected:
  22. DECLARE_MESSAGE_MAP()
  23. };
  24. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  25. {
  26. }
  27. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  28. {
  29. CDialog::DoDataExchange(pDX);
  30. }
  31. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  32. END_MESSAGE_MAP()
  33. // CMemoryDlg 对话框
  34. CMemoryDlg::CMemoryDlg(CWnd* pParent /*=NULL*/)
  35. : CDialog(CMemoryDlg::IDD, pParent)
  36. {
  37. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  38. //初始化内存分区
  39. partionarray[0].MemorySize=4;
  40. partionarray[0].Is_Load=false;
  41. partionarray[1].MemorySize=32;
  42. partionarray[1].Is_Load=false;
  43. partionarray[2].MemorySize=8;
  44. partionarray[2].Is_Load=false;
  45. partionarray[3].MemorySize=16;
  46. partionarray[3].Is_Load=false;
  47. partionarray[4].MemorySize=4;
  48. partionarray[4].Is_Load=false;
  49. partionarray[5].MemorySize=16;
  50. partionarray[5].Is_Load=false;
  51. partionarray[6].MemorySize=16;
  52. partionarray[6].Is_Load=false;
  53. partionarray[7].MemorySize=8;
  54. partionarray[7].Is_Load=false;
  55. partionarray[8].MemorySize=32;
  56. partionarray[8].Is_Load=false;
  57. partionarray[9].MemorySize=8;
  58. partionarray[9].Is_Load=false;
  59. //初始化作业数组
  60. for(int i=0;i<100;i++)
  61. {
  62. Taskarray[i].Loadtime="";
  63. Taskarray[i].taskrunningtime=0;
  64. Taskarray[i].taskruntime=0;
  65. Taskarray[i].tasksize=0;
  66. Taskarray[i].taskstayno=0;
  67. Taskarray[i].taskstatus=0;
  68. }
  69. }
  70. void CMemoryDlg::DoDataExchange(CDataExchange* pDX)
  71. {
  72. CDialog::DoDataExchange(pDX);
  73. DDX_Control(pDX, IDC_LISTSHOW, m_bListCtrl);
  74. DDX_Control(pDX, IDC_LISTSTATUS, m_listctrl);
  75. }
  76. BEGIN_MESSAGE_MAP(CMemoryDlg, CDialog)
  77. ON_WM_SYSCOMMAND()
  78. ON_WM_PAINT()
  79. ON_WM_QUERYDRAGICON()
  80. //}}AFX_MSG_MAP
  81. ON_BN_CLICKED(IDC_BTN_START, &CMemoryDlg::OnBnClickedBtnStart)
  82. ON_WM_TIMER()
  83. END_MESSAGE_MAP()
  84. // CMemoryDlg 消息处理程序
  85. BOOL CMemoryDlg::OnInitDialog()
  86. {
  87. CDialog::OnInitDialog();
  88. // 将“关于...”菜单项添加到系统菜单中。
  89. // IDM_ABOUTBOX 必须在系统命令范围内。
  90. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  91. ASSERT(IDM_ABOUTBOX < 0xF000);
  92. CMenu* pSysMenu = GetSystemMenu(FALSE);
  93. if (pSysMenu != NULL)
  94. {
  95. BOOL bNameValid;
  96. CString strAboutMenu;
  97. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  98. ASSERT(bNameValid);
  99. if (!strAboutMenu.IsEmpty())
  100. {
  101. pSysMenu->AppendMenu(MF_SEPARATOR);
  102. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  103. }
  104. }
  105. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  106. //  执行此操作
  107. SetIcon(m_hIcon, TRUE); // 设置大图标
  108. SetIcon(m_hIcon, FALSE); // 设置小图标
  109. // TODO: 在此添加额外的初始化代码
  110. //初始化左边的列表框
  111. m_listctrl.SetExtendedStyle( LVS_EX_GRIDLINES|LVS_EX_ONECLICKACTIVATE|LVS_EX_FULLROWSELECT);
  112. m_listctrl.InsertColumn(0,_T("分区号"),LVCFMT_LEFT,60);
  113. m_listctrl.InsertColumn(1,_T("分区大小"),LVCFMT_LEFT,80);
  114. m_listctrl.InsertColumn(2,_T("分配状态"),LVCFMT_LEFT,80);
  115. for(int i=0;i<10;i++)
  116. {
  117. CString stra,strb;
  118. stra.Format(_T("%dK"),partionarray[i].MemorySize);
  119. strb.Format(_T("%d"),i);
  120. m_listctrl.InsertItem(i,strb);
  121. m_listctrl.SetItemText(i,1,stra);
  122. m_listctrl.SetItemText(i,2,_T("未分配"));
  123. }
  124. //初始化右边的列表框
  125. m_bListCtrl.SetExtendedStyle( LVS_EX_GRIDLINES|LVS_EX_ONECLICKACTIVATE|LVS_EX_FULLROWSELECT);
  126. m_bListCtrl.InsertColumn(0,_T("作业名称"),LVCFMT_LEFT,80);
  127. m_bListCtrl.InsertColumn(1,_T("作业大小"),LVCFMT_LEFT,80);
  128. m_bListCtrl.InsertColumn(2,_T("开始时间"),LVCFMT_LEFT,90);
  129. m_bListCtrl.InsertColumn(3,_T("运行时间"),LVCFMT_LEFT,80);
  130. m_bListCtrl.InsertColumn(4,_T("已运行"),LVCFMT_LEFT,80);
  131. m_bListCtrl.InsertColumn(5,_T("运行状态"),LVCFMT_LEFT,150);
  132. return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  133. }
  134. void CMemoryDlg::OnSysCommand(UINT nID, LPARAM lParam)
  135. {
  136. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  137. {
  138. CAboutDlg dlgAbout;
  139. dlgAbout.DoModal();
  140. }
  141. else
  142. {
  143. CDialog::OnSysCommand(nID, lParam);
  144. }
  145. }
  146. // 如果向对话框添加最小化按钮,则需要下面的代码
  147. //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  148. //  这将由框架自动完成。
  149. void CMemoryDlg::OnPaint()
  150. {
  151. if (IsIconic())
  152. {
  153. CPaintDC dc(this); // 用于绘制的设备上下文
  154. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  155. // 使图标在工作区矩形中居中
  156. int cxIcon = GetSystemMetrics(SM_CXICON);
  157. int cyIcon = GetSystemMetrics(SM_CYICON);
  158. CRect rect;
  159. GetClientRect(&rect);
  160. int x = (rect.Width() - cxIcon + 1) / 2;
  161. int y = (rect.Height() - cyIcon + 1) / 2;
  162. // 绘制图标
  163. dc.DrawIcon(x, y, m_hIcon);
  164. }
  165. else
  166. {
  167. CDialog::OnPaint();
  168. }
  169. }
  170. //当用户拖动最小化窗口时系统调用此函数取得光标
  171. //显示。
  172. HCURSOR CMemoryDlg::OnQueryDragIcon()
  173. {
  174. return static_cast<HCURSOR>(m_hIcon);
  175. }
  176. void CMemoryDlg::OnBnClickedBtnStart()
  177. {
  178. // TODO: 在此添加控件通知处理程序代码
  179. SetTimer(1,5000,NULL);
  180. SetTimer(2,1000,NULL);
  181. }
  182. void CMemoryDlg::OnTimer(UINT_PTR nIDEvent)
  183. {
  184. // TODO: 在此添加消息处理程序代码和/或调用默认值
  185. int  size(0),temp(1000),delta(0),maxsize(0),runningnum(0);
  186. static int taskno(0),clock(0),diskno(0),runningtime(0);
  187. switch(nIDEvent) 
  188. {
  189. case 1:
  190. if(taskno<100)
  191. {
  192. srand((unsigned)time(NULL));
  193. size=rand()%34+1;
  194. Taskarray[taskno].tasksize=size;
  195. CString stra,strb;
  196. stra.Format(_T("作业%d"),taskno+1);
  197. m_bListCtrl.InsertItem(taskno,stra);
  198. strb.Format(_T("%dK"),Taskarray[taskno].tasksize);
  199. m_bListCtrl.SetItemText(taskno,1,strb);
  200. if(Taskarray[taskno].tasksize>32)
  201. {
  202. m_bListCtrl.SetItemText(taskno,5,_T("作业太大,不能执行,抛弃!"));
  203. Taskarray[taskno].taskstatus=2;    //2表示作业已经运行结束或者抛弃 
  204. taskno++;
  205. break;
  206. }
  207. for(int i=0;i<10;i++)
  208. {
  209. if(!partionarray[i].Is_Load)
  210. {
  211. if(partionarray[i].MemorySize>maxsize)
  212. maxsize=partionarray[i].MemorySize; //查找目前分区表里面的最大分区
  213. delta=partionarray[i].MemorySize-Taskarray[taskno].tasksize;
  214. if(!delta)
  215. {
  216. diskno=i; //确定盘块儿号
  217. break;
  218. }
  219. else if(delta<0)
  220. continue;
  221. else
  222. {
  223. if(temp>delta)
  224. {
  225. temp=delta;   //找和作业大小最接近的分区号
  226. diskno=i;
  227. }
  228. }
  229. }
  230. }
  231. Taskarray[taskno].taskstayno=diskno; //保存占用的分区号
  232. if(Taskarray[taskno].tasksize>maxsize)
  233. m_bListCtrl.SetItemText(taskno,5,_T("内存空间不足,等待"));
  234. else
  235. {
  236. if(runningnum>10)
  237. m_bListCtrl.SetItemText(taskno,5,_T("内存空间不足,等待"));
  238. else
  239. {
  240. runningnum++;
  241. Taskarray[taskno].taskstatus=1;     //作业已装入
  242. partionarray[diskno].Is_Load=true; //作业在分区中运行
  243. m_listctrl.SetItemText(diskno,2,_T("已分配"));
  244. CTime t = CTime::GetCurrentTime();
  245. CString strtime=t.Format(_T("%H:%M:%S"));
  246. Taskarray[taskno].Loadtime=strtime;
  247. m_bListCtrl.SetItemText(taskno,2,strtime); //显示开始运行时间
  248. Taskarray[taskno].taskruntime=rand()%34+1;  //随机生成作业运行时间
  249. CString strc;
  250. strc.Format(_T("%d s"),Taskarray[taskno].taskruntime);
  251. m_bListCtrl.SetItemText(taskno,3,strc);
  252. m_bListCtrl.SetItemText(taskno,5,_T("正在运行"));
  253. }
  254. }
  255. taskno++;
  256. }
  257. break;
  258. case 2:
  259. {
  260. clock++;
  261. if(clock>4)
  262. {
  263. //更新显示的情况
  264. for(int j=0;j<taskno;j++)
  265. {
  266. if(Taskarray[j].taskstatus==1)
  267. {
  268. Taskarray[j].taskrunningtime++;
  269. CString strd;
  270. strd.Format(_T("%d s"),Taskarray[j].taskrunningtime);
  271. m_bListCtrl.SetItemText(j,4,strd);
  272. if(Taskarray[j].taskrunningtime==Taskarray[j].taskruntime)
  273. {
  274. Taskarray[j].taskstatus=false;
  275. partionarray[Taskarray[j].taskstayno].Is_Load=false;  //释放占用的分区
  276. m_listctrl.SetItemText(j,2,_T("未分配"));
  277. m_bListCtrl.SetItemText(j,5,_T("已停止"));
  278. }
  279. }
  280. }
  281. //对没有进入分区的作业进行更新
  282. //for(int k=0,!Taskarray[k].taskstatus;k<taskno;k++)
  283. //{
  284. // for(int i=0;i<10;i++)
  285. // {
  286. // if(!partionarray[i].Is_Load)
  287. // {
  288. // if(partionarray[i].MemorySize>maxsize)
  289. // maxsize=partionarray[i].MemorySize; //查找目前分区表里面的最大分区
  290. // delta=partionarray[i].MemorySize-Taskarray[taskno].tasksize;
  291. // if(!delta)
  292. // {
  293. // diskno=i; //确定盘块儿号
  294. // break;
  295. // }
  296. // else if(delta<0)
  297. // continue;
  298. // else
  299. // {
  300. // if(temp>delta)
  301. // {
  302. // temp=delta;   //找和作业大小最接近的分区号
  303. // diskno=i;
  304. // }
  305. // }
  306. // }
  307. // }
  308. // Taskarray[k].taskstayno=diskno;
  309. // Taskarray[k].taskstatus=1;     //作业已装入
  310. // partionarray[k].Is_Load=true; //作业在分区中运行
  311. // m_listctrl.SetItemText(k,2,_T("已分配"));
  312. // CTime t = CTime::GetCurrentTime();
  313. // CString strtime=t.Format(_T("%H:%M:%S"));
  314. // Taskarray[k].Loadtime=strtime;
  315. // m_bListCtrl.SetItemText(k,2,Taskarray[k].Loadtime); //显示开始运行时间
  316. // Taskarray[k].taskruntime=rand()%34+1;  //随机生成作业运行时间
  317. // CString strc;
  318. // strc.Format(_T("%d s"),Taskarray[k].taskruntime);
  319. // m_bListCtrl.SetItemText(k,3,strc);
  320. // m_bListCtrl.SetItemText(k,5,_T("正在运行"));
  321. //}
  322. }
  323. }
  324. break;
  325. default:
  326. break;
  327. }
  328. CDialog::OnTimer(nIDEvent);
  329. }