#include "stdafx.h"
#include "MemAlloc.h"
#include "MemAllocDlg.h"
CMemAllocDlg::CMemAllocDlg(CWnd* pParent /*=NULL*/)
: CGCDialog(CMemAllocDlg::IDD, pParent)
, m_nPolicy(0)
, m_sLength(_T(""))
, m_sBlockNum(_T(""))
, _n(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_btnFree.BACK=RGB(0xf0,0xf0,0xfe);
m_btnAlloc.BACK=RGB(0xe8,0xe8,0xfe);
m_btnCancel.BACK=RGB(0xf0,0xf0,0xfe);
m_btnReset.BACK=RGB(0xed,0xed,0xfe);
m_brStatic[0].CreateSolidBrush(RGB(0xd1,0xd1,0xfe));
m_brStatic[1].CreateSolidBrush(RGB(0xd4,0xd4,0xfe));
m_brStatic[2].CreateSolidBrush(RGB(0xd7,0xd7,0xfe));
m_brStatic[3].CreateSolidBrush(RGB(0xdb,0xdb,0xfe));
m_brStatic[4].CreateSolidBrush(RGB(0xe6,0xe6,0xfe));
m_brStatic[5].CreateSolidBrush(RGB(0xe8,0xe8,0xfe));
m_brStatic[6].CreateSolidBrush(RGB(0xed,0xed,0xfe));
m_brStatic[7].CreateSolidBrush(RGB(0xf0,0xf0,0xfe));
m_brStatic[8].CreateSolidBrush(RGB(0xf5,0xf5,0xfe));
alloc=NULL;
empty=new MCB;
empty->Pos=0;empty->Size=560;empty->Num=0;empty->next=NULL;
}
CMemAllocDlg::~CMemAllocDlg()
{
for(MCB *i=alloc,*j;i;i=j)
{
j=i->next;
delete i;
}
for(MCB *i=empty,*j;i;i=j)
{
j=i->next;
delete i;
}
}
void CMemAllocDlg::DoDataExchange(CDataExchange* pDX)
{
CGCDialog::DoDataExchange(pDX);
DDX_Radio(pDX, IDC_POLICY, m_nPolicy);
DDX_Control(pDX, IDC_ALLOCLIST, m_AllocList);
DDX_Control(pDX, IDC_EMPTYLIST, m_EmptyList);
DDX_Control(pDX, IDC_HISTORY, m_HistoryList);
DDX_Control(pDX, IDC_RESET, m_btnReset);
DDX_Control(pDX, IDCANCEL, m_btnCancel);
DDX_Control(pDX, IDC_ALLOC, m_btnAlloc);
DDX_Control(pDX, IDC_FREE, m_btnFree);
DDX_CBString(pDX, IDC_LENGTH, m_sLength);
DDX_CBString(pDX, IDC_BLOCKNUM, m_sBlockNum);
DDX_Control(pDX, IDC_BLOCKNUM, m_cbBlockNum);
DDX_Control(pDX, IDC_MESSAGE, m_ebMessage);
DDV_MaxChars(pDX, m_sLength, 3);
}
BEGIN_MESSAGE_MAP(CMemAllocDlg, CGCDialog)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_ALLOC, OnBnClickedAlloc)
ON_BN_CLICKED(IDC_FREE, OnBnClickedFree)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_RESET, OnBnClickedReset)
END_MESSAGE_MAP()
BOOL CMemAllocDlg::OnInitDialog()
{
CGCDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
SetWindowText(_T("操作系统之内存分配"));
m_AllocList.InsertColumn(0,_T("#"),LVCFMT_LEFT,24);
m_AllocList.InsertColumn(1,_T("地址"),LVCFMT_LEFT,36);
m_AllocList.InsertColumn(2,_T("长度"),LVCFMT_LEFT,36);
m_AllocList.SetExtendedStyle(LVS_EX_GRIDLINES);
m_EmptyList.InsertColumn(0,_T("#"),LVCFMT_LEFT,24);
m_EmptyList.InsertColumn(1,_T("地址"),LVCFMT_LEFT,36);
m_EmptyList.InsertColumn(2,_T("长度"),LVCFMT_LEFT,36);
m_EmptyList.SetExtendedStyle(LVS_EX_GRIDLINES);
UpdateUI();
return TRUE;
}
void CMemAllocDlg::OnPaint()
{
if(!IsIconic())
{
CGCDialog::OnPaint();
DrawStatus();
}
}
void CMemAllocDlg::UpdateUI()
{
m_AllocList.DeleteAllItems();
for(MCB *i=alloc;i;i=i->next)
{
CString str;
int count=m_AllocList.GetItemCount();
str.Format(_T("%d"),i->Num);
m_AllocList.InsertItem(count,str);
str.Format(_T("%d"),i->Pos);
m_AllocList.SetItemText(count,1,str);
str.Format(_T("%d"),i->Size);
m_AllocList.SetItemText(count,2,str);
}
m_EmptyList.DeleteAllItems();
for(MCB *i=empty;i;i=i->next)
{
CString str;
int count=m_EmptyList.GetItemCount();
str.Format(_T("%d"),i->Num);
m_EmptyList.InsertItem(count,str);
str.Format(_T("%d"),i->Pos);
m_EmptyList.SetItemText(count,1,str);
str.Format(_T("%d"),i->Size);
m_EmptyList.SetItemText(count,2,str);
}
m_cbBlockNum.ResetContent();
for(MCB *i=alloc;i;i=i->next)
{
CString str;
str.Format(_T("%d"),i->Num);
m_cbBlockNum.AddString(str);
}
m_cbBlockNum.SetCurSel(0);
DrawStatus();
}
void CMemAllocDlg::AddHistoryItem(int nTypeID,int param)
{
CString s;
switch(nTypeID)
{
case MEMALLOC:s.Format(_T("分配 %dKB 内存"),param);break;
case MEMFREE:s.Format(_T("释放 %dKB 内存"),param);break;
case ALLOCFAIL:s=_T("!内存不足");break;
case FREEFAIL:s.Format(_T("!不存在%d号内存块"),param);break;
default:break;
}
m_HistoryList.AddString(s);
m_ebMessage.SetWindowText(s);
}
void CMemAllocDlg::DrawStatus()
{
const int x=23,y=360,cx=562,cy=50;
CDC *pdc=GetDC();
CDC mdc;
CBitmap bmp;
mdc.CreateCompatibleDC(pdc);
bmp.CreateCompatibleBitmap(pdc,cx,cy);
mdc.SelectObject(&bmp);
CPen pen,*oldpen;
pen.CreatePen(PS_SOLID,2,RGB(0,0,0));
oldpen=mdc.SelectObject(&pen);
mdc.Rectangle(1,1,cx,cy);
mdc.SelectObject(oldpen);
for(MCB *i=alloc;i;i=i->next)
{
for(int j=0;j<i->Size;j++)
for(int k=0;k<cy-2;k++)
mdc.SetPixel(j+i->Pos+1,k+1,GradientColor(j+1,k+1,i->Size+2,cy+1,i->Num%3));
if(i->Size>9)
{
CString s;
s.Format(_T("%d"),i->Num);
mdc.SetBkMode(TRANSPARENT);
mdc.DrawText(s,CRect(i->Pos,0,i->Pos+i->Size+1,cy-1),DT_SINGLELINE|DT_VCENTER|DT_CENTER);
}
}
pdc->BitBlt(x,y,x+cx,y+cy,&mdc,0,0,SRCCOPY);
}
COLORREF CMemAllocDlg::GradientColor(int x,int y,int cx,int cy,int opt)
{
#define pi 3.14159265358979
double fx=(double)x/cx,fy=(double)y/cy;
COLORREF hc,lc=RGB(0xff,0xff,0xff);
switch(opt)
{
case 0:hc=RGB(0xff,0xff,0);break;
case 1:hc=RGB(0,0xff,0xff);break;
case 2:hc=RGB(0xff,0,0xff);break;
}
fx=sin(fx*pi);
fy=sin(fy*pi);
fx=pow(fx,.1);
fy=pow(fy,.1);
#undef pi
return RGB(fx*GetRValue(hc)+fy*GetRValue(lc),
fx*GetGValue(hc)+fy*GetGValue(lc),
fx*GetBValue(hc)+fy*GetBValue(lc));
}
void CMemAllocDlg::OnBnClickedAlloc()
{
UpdateData();
int len=atoi(m_sLength);
if(!len)return;
MCB *i=empty,*j=NULL;
for(;i;j=i,i=i->next)
if(i->Size>=len)
{// 找到第一个长度合适的内存块
MCB *p=new MCB;
p->Num=++_n;
p->Pos=i->Pos;
p->Size=len;
p->next=NULL;
if(alloc)
{
MCB *k=alloc;
for(;k->next;k=k->next);
k->next=p;
}
else alloc=p;
i->Pos+=len;
i->Size-=len;
// 下面去掉长度为0的空闲块
if(!i->Size)
{
if(j)j->next=i->next;
else empty=i->next;
delete i;
}
// 下面更新用户界面
UpdateUI();
AddHistoryItem(MEMALLOC,len);
break;
}
if(!i)AddHistoryItem(ALLOCFAIL,len);
}
void CMemAllocDlg::OnBnClickedFree()
{
UpdateData();
int bnum=atoi(m_sBlockNum);
if(!bnum)return;
MCB *i=alloc,*j=NULL;
for(;i;j=i,i=i->next)
if(i->Num==bnum)
{// 找到要释放的内存块
if(!j)alloc=i->next;
else j->next=i->next;
i->next=NULL;
if(empty)
{
MCB *k=empty;
for(;k->next;k=k->next);
k->next=i;
}
else empty=i;
bnum=i->Size;
if(empty)
{ // 下面对空闲块链按地址排序
for(MCB *p=empty->next;p;p=p->next)
for(MCB *q=empty;q;q=q->next)
if(p->Pos<q->Pos)
{
int t=p->Num;
p->Num=q->Num;
q->Num=t;
t=p->Pos;
p->Pos=q->Pos;
q->Pos=t;
t=p->Size;
p->Size=q->Size;
q->Size=t;
}
// 下面对相邻的空闲区进行合并
for(MCB *q=empty,*p=q->next;p;q=p,p=p->next)
if(q->Pos+q->Size==p->Pos)
{
q->Size+=p->Size;
q->next=p->next;
delete p;
p=q;
}
}
// 下面更新用户界面
UpdateUI();
AddHistoryItem(MEMFREE,bnum);
break;
}
if(!i)AddHistoryItem(FREEFAIL,bnum);
}
HBRUSH CMemAllocDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CGCDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch(pWnd->GetDlgCtrlID())
{
case IDC_STATIC:case IDC_STATIC4:case IDC_STATIC7:case IDC_STATIC9:
pDC->SetTextColor(RGB(0,0x51,0xf8));
}
switch(pWnd->GetDlgCtrlID())
{
case IDC_STATIC:return m_brStatic[0];
case IDC_POLICY:return m_brStatic[1];
case IDC_STATIC2:return m_brStatic[2];
case IDC_STATIC3:return m_brStatic[3];
case IDC_STATIC4:return m_brStatic[4];
case IDC_STATIC5:case IDC_STATIC6:return m_brStatic[5];
case IDC_STATIC7:return m_brStatic[6];
case IDC_STATIC8:return m_br
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
.rar (49个子文件)
操作系统课程设计之内存分配问题
resource.h 2KB
GCDialog.h 452B
stdafx.h 102B
MemAlloc.vcproj.WWW-D05880D1338.Administrator.user 1KB
MemAlloc.suo 11KB
MemAlloc.vcproj.7.10.old 5KB
_UpgradeReport_Files
UpgradeReport.xslt 12KB
UpgradeReport_Plus.gif 71B
UpgradeReport.css 3KB
UpgradeReport_Minus.gif 69B
MemAlloc.rc 7KB
MemAlloc.vcproj 6KB
MemAlloc.sln.old 905B
Debug
MemAlloc.pch 19.75MB
stdafx.obj 360KB
GCDialog.obj 29KB
vc90.idb 771KB
GCButton.obj 27KB
BuildLog.htm 11KB
MemAlloc.obj 18KB
MemAllocDlg.obj 61KB
MemAlloc.exe.intermediate.manifest 861B
MemAlloc.pdb 2.89MB
mt.dep 65B
vc90.pdb 1.41MB
MemAlloc.exe 143KB
MemAlloc.exe.embed.manifest.res 1KB
MemAlloc.res 52KB
MemAlloc.exe.embed.manifest 1KB
MemAlloc.ilk 1.07MB
stdafx.cpp 21B
MemAlloc.h 154B
GCButton.cpp 2KB
MemAlloc.vcproj.清扬-PC.清扬.user 1KB
MemAlloc.exe 124KB
Release
MemAlloc.suo.old 8KB
UpgradeLog.XML 4KB
MemAllocDlg.h 1KB
MemAlloc.cpp 262B
res
MemAlloc.manifest 697B
logo.bmp 38KB
MemAlloc.rc2 364B
MemAlloc.ico 11KB
GCButton.h 382B
MemAlloc.sln 876B
MemAllocDlg.cpp 8KB
MemAlloc.ncb 9.79MB
MemAlloc.aps 72KB
GCDialog.cpp 2KB
共 49 条
- 1
资源评论
qingyang_0
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功