📄 os1dlg.cpp
字号:
baseaddr.Format("%d",pCur->BaseAddress);
pCur->BaseAddress=pCur->BaseAddress+atoi(allocnum);
pCur->FreeLength=pCur->FreeLength-atoi(allocnum);
if (pCur->FreeLength==0)
{
pCurrent->pNext=pCur->pNext;
delete pCur;
}
pHead1=pnew;
pnew->pNext1=NULL;
ProList(proname,baseaddr,allocnum);
OnAllocDraw(pnew->proBaseAddress,atoi(allocnum));
OnPaint();
}
return;
}
else
{
pCur=pCur->pNext;
pCurrent=pCurrent->pNext;
}
}
}
else
{
CFREEMEM *pCurr=NULL;
pCurr=pCurrent;
if(pCurr->FreeLength>=atoi(allocnum))
{
pCurrent1=pHead1;
if (pCurrent1!=NULL)
{
while(pCurrent1->pNext1!=NULL)
pCurrent1=pCurrent1->pNext1;
COSPRO *pnew;
pnew=(COSPRO *)(new COSPRO);
pnew->proName=proname;
pnew->proLength=atoi(allocnum);
pnew->proBaseAddress=pCurr->BaseAddress;
baseaddr.Format("%d",pCurr->BaseAddress);
pCurr->BaseAddress=pCurr->BaseAddress+atoi(allocnum);
pCurr->FreeLength=pCurr->FreeLength-atoi(allocnum);
if (pCurr->FreeLength==0)
{
if (pCurr->pNext!=NULL)
{
pHead=pCurr->pNext;
pCurr=NULL;
}
else
{
pCurr=pHead=NULL;
}
}
pCurrent1->pNext1=pnew;
pnew->pNext1=NULL;
ProList(proname,baseaddr,allocnum);
OnAllocDraw(pnew->proBaseAddress,atoi(allocnum));
OnPaint();
}
else
{
pHead1=(COSPRO *)(new COSPRO);
COSPRO *pnew;
pnew=(COSPRO *)(new COSPRO);
pnew->proName=proname;
pnew->proLength=atoi(allocnum);
pnew->proBaseAddress=pCurr->BaseAddress;
baseaddr.Format("%d",pCurr->BaseAddress);
pCurr->BaseAddress=pCurr->BaseAddress+atoi(allocnum);
pCurr->FreeLength=pCurr->FreeLength-atoi(allocnum);
if (pCurr->FreeLength==0)
{
if (pCurr->pNext!=NULL)
{
pHead=pCurr->pNext;
pCurr=NULL;
}
else
{
pCurr=pHead=NULL;
}
}
pHead1=pnew;
pnew->pNext1=NULL;
ProList(proname,baseaddr,allocnum);
OnAllocDraw(pnew->proBaseAddress,atoi(allocnum));
OnPaint();
}
}
else
{
MessageBox("内存不足,不能完成此次分配!");
pEdit2->SetWindowText("");
pEdit2->SetFocus();
return;
}
}
}
else
{
MessageBox("内存不足,不能完成此次分配!");
pEdit2->SetWindowText("");
pEdit2->SetFocus();
return;
}
}
void COS1Dlg::ProList(CString proname,CString baseaddr,CString len)
{
CString m_strPro,proName;
proName.Format("%-10s",proname);
baseaddr.Format("%-12s",baseaddr);
len.Format("%-10s",len);
m_strPro=" "+proName+baseaddr+len;
CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LISTPRO);
int nIndex = pListBox->FindStringExact(-1,m_strPro);
nIndex=pListBox->AddString(m_strPro);
pListBox->SetItemDataPtr(nIndex,new CString(proname));
}
void COS1Dlg::OnAllocDraw(int baseaddr, int len)
{
CString tp="",tp1="";
int lenn=0;
COSPRO *pCurrent2;
pCurrent2=pHead1;
if (pCurrent2!=NULL)
{
pCurrent2=pCurrent2->pNext1;
while(pCurrent2!=NULL)
{
lenn+=pCurrent2->proLength;
pCurrent2=pCurrent2->pNext1;
}
}
tp.Format("%d",lenn*100/260000);
tp1.Format("%d",(260000-lenn));
CWnd *pWnd = GetDlgItem(IDC_BK);
CRect rcClient;
CDC *pDC =pWnd->GetDC();
CBrush drawBrush;
CPen newPen,*oldPen;
LOGFONT LocalLogFont;
memset(&LocalLogFont,0,sizeof(LOGFONT));
LocalLogFont.lfCharSet=GB2312_CHARSET;
strcpy(LocalLogFont.lfFaceName, "黑体");
LocalLogFont.lfEscapement = 0;
LocalLogFont.lfOrientation = 0;
LocalLogFont.lfWeight = 700;
pDC->SetBkColor(RGB(202,243,227));
pDC->SetTextColor(RGB(7,180,286));
CFont MyFont,*cMyOldFont;
MyFont.CreateFontIndirect(&LocalLogFont);
cMyOldFont = pDC->SelectObject(&MyFont);
oldPen =pDC->SelectObject(&newPen);
pWnd->GetClientRect(rcClient);
pDC->TextOut(rcClient.left+145,rcClient.top+118,tp+"%"+"( 剩余"+tp1+"KB)");
pDC->SelectObject(cMyOldFont);
MyFont.DeleteObject();
newPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
oldPen =pDC->SelectObject(&newPen);
for(int i=(baseaddr*128/260000);i<((baseaddr*128/260000)+(len*128/260000)+1);i++)
{
pDC->MoveTo(rcClient.left+24+3*i,rcClient.top+18);
pDC->LineTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()/2-1);
pDC->MoveTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()/2+1);
pDC->LineTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()-19);
}
pDC->SelectObject(oldPen);
newPen.Detach();
}
void COS1Dlg::OnBunalloc()
{
// TODO: Add your control notification handler code here
CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LISTPRO);
CString *proname1,proname;
int proBaseAddr;
int proLength;
int proLastAddr=0;
int nIndex= pListBox->GetCurSel();
if (nIndex==LB_ERR)
{
MessageBox("您没有选择要回收的进程!");
return;
}
proname1=(CString *)pListBox->GetItemDataPtr(nIndex);
proname=*proname1;
delete (CString *)pListBox->GetItemDataPtr(nIndex);
pListBox->DeleteString(nIndex);
COSPRO *pCurrent2;
pCurrent1=pHead1;
pCurrent2=pCurrent1->pNext1;
if (pCurrent2!=NULL)
{
while (pCurrent2!=0)
{
if(pCurrent2->proName==proname)
{
pCurrent1->pNext1=pCurrent2->pNext1;
proBaseAddr=pCurrent2->proBaseAddress;
proLength=pCurrent2->proLength;
proLastAddr=proBaseAddr+proLength;
delete pCurrent2;
break;
}
else
{
if(pCurrent1->proName==proname)
{
proBaseAddr=pCurrent1->proBaseAddress;
proLength=pCurrent1->proLength;
proLastAddr=proBaseAddr+proLength;
pHead1=pCurrent2;
delete pCurrent1;
break;
}
pCurrent1=pCurrent1->pNext1;
pCurrent2=pCurrent2->pNext1;
}
}
}
else
{
if(pCurrent1->proName==proname)
{
proBaseAddr=pCurrent1->proBaseAddress;
proLength=pCurrent1->proLength;
proLastAddr=proBaseAddr+proLength;
pHead1=NULL;
delete pCurrent1;
}
}
CFREEMEM *pCurrent3,*pnew;
pCurrent=pHead;
if(pCurrent!=NULL)
{
pCurrent3=pCurrent->pNext;
if (pCurrent3!=NULL)
{
while(pCurrent3!=NULL)
{
if((pCurrent->BaseAddress+pCurrent->FreeLength==proBaseAddr)||(proLastAddr==pCurrent3->BaseAddress))
{
if((pCurrent->BaseAddress+pCurrent->FreeLength==proBaseAddr)&&(proLastAddr==pCurrent3->BaseAddress))
{
pCurrent->FreeLength=pCurrent->FreeLength+proLength+pCurrent3->FreeLength;
pCurrent->pNext=pCurrent3->pNext;
delete pCurrent3;
break;
}
if((pCurrent->BaseAddress+pCurrent->FreeLength==proBaseAddr)&&(proLastAddr<pCurrent3->BaseAddress))
{
pCurrent->FreeLength+=proLength;
break;
}
if((pCurrent->BaseAddress+pCurrent->FreeLength<proBaseAddr)&&(proLastAddr==pCurrent3->BaseAddress))
{
pCurrent3->BaseAddress=proBaseAddr;
pCurrent3->FreeLength+=proLength;
break;
}
}
else
{
if((pCurrent->BaseAddress+pCurrent->FreeLength<proBaseAddr)&&(proLastAddr<pCurrent3->BaseAddress))
{
pnew=(CFREEMEM *)(new CFREEMEM);
pnew->BaseAddress=proBaseAddr;
pnew->FreeLength=proLength;
pnew->pNext=pCurrent3;
pCurrent->pNext=pnew;
break;
}
if((pHead==pCurrent)&&(proLastAddr==pCurrent->BaseAddress))
{
pCurrent->BaseAddress=proBaseAddr;
pCurrent->FreeLength+=proLength;
pHead=pCurrent;
break;
}
if((pHead==pCurrent)&&(proLastAddr<pCurrent->BaseAddress))
{
pnew=(CFREEMEM *)(new CFREEMEM);
pnew->BaseAddress=proBaseAddr;
pnew->FreeLength=proLength;
pnew->pNext=pCurrent;
pHead=pnew;
break;
}
if((pCurrent3->pNext==NULL)&&(proBaseAddr==(pCurrent3->BaseAddress+pCurrent3->FreeLength)))
{
pCurrent3->FreeLength+=proLength;
break;
}
if((pCurrent3->pNext==NULL)&&(proBaseAddr>(pCurrent3->BaseAddress+pCurrent3->FreeLength)))
{
pnew=(CFREEMEM *)(new CFREEMEM);
pnew->BaseAddress=proBaseAddr;
pnew->FreeLength=proLength;
pnew->pNext=NULL;
pCurrent3->pNext=pnew;
break;
}
pCurrent=pCurrent->pNext;
pCurrent3=pCurrent3->pNext;
}
}
}
else
{
if(proLastAddr==pCurrent->BaseAddress)
{
pCurrent->BaseAddress=proBaseAddr;
pCurrent->FreeLength+=proLength;
pHead=pCurrent;
}
if(proLastAddr<pCurrent->BaseAddress)
{
pnew=(CFREEMEM *)(new CFREEMEM);
pnew->BaseAddress=proBaseAddr;
pnew->FreeLength=proLength;
pnew->pNext=pCurrent;
pHead=pnew;
}
if(pCurrent->BaseAddress+pCurrent->FreeLength==proBaseAddr)
{
pCurrent->FreeLength+=proLength;
pCurrent->pNext=NULL;
}
if(pCurrent->BaseAddress+pCurrent->FreeLength<proBaseAddr)
{
pnew=(CFREEMEM *)(new CFREEMEM);
pnew->BaseAddress=proBaseAddr;
pnew->FreeLength=proLength;
pnew->pNext=NULL;
pCurrent->pNext=pnew;
}
}
}
else
{
pnew=(CFREEMEM *)(new CFREEMEM);
pnew->BaseAddress=proBaseAddr;
pnew->FreeLength=proLength;
pnew->pNext=NULL;
pCurrent=pHead=pnew;
}
OnUnAllocDraw(proBaseAddr,proLength);
OnPaint();
}
void COS1Dlg::OnUnAllocDraw(int baseaddr, int len)
{
CString tp="",tp1="";
int lenn=0;
COSPRO *pCurrent2;
pCurrent2=pHead1;
if (pCurrent2!=NULL)
{
while(pCurrent2!=NULL)
{
lenn+=pCurrent2->proLength;
pCurrent2=pCurrent2->pNext1;
}
}
tp.Format("%d",lenn*100/260000);
tp1.Format("%d",(260000-lenn));
CWnd *pWnd = GetDlgItem(IDC_BK);
CRect rcClient;
CDC *pDC =pWnd->GetDC();
CBrush drawBrush;
CPen newPen,*oldPen;
LOGFONT LocalLogFont;
memset(&LocalLogFont,0,sizeof(LOGFONT));
LocalLogFont.lfCharSet=GB2312_CHARSET;
strcpy(LocalLogFont.lfFaceName, "黑体");
LocalLogFont.lfEscapement = 0;
LocalLogFont.lfOrientation = 0;
LocalLogFont.lfWeight = 700;
pDC->SetBkColor(RGB(202,243,227));
pDC->SetTextColor(RGB(7,180,286));
CFont MyFont,*cMyOldFont;
MyFont.CreateFontIndirect(&LocalLogFont);
cMyOldFont = pDC->SelectObject(&MyFont);
oldPen =pDC->SelectObject(&newPen);
pWnd->GetClientRect(rcClient);
pDC->TextOut(rcClient.left+145,rcClient.top+118,tp+"%"+"( 剩余"+tp1+"KB)");
pDC->SelectObject(cMyOldFont);
MyFont.DeleteObject();
newPen.CreatePen(PS_SOLID,2,RGB(152,101,101));
oldPen =pDC->SelectObject(&newPen);
for(int i=(baseaddr*128/260000);i<((baseaddr*128/260000)+(len*128/260000));i++)
{
pDC->MoveTo(rcClient.left+24+3*i,rcClient.top+18);
pDC->LineTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()/2-1);
pDC->MoveTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()/2+1);
pDC->LineTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()-19);
}
pDC->SelectObject(oldPen);
newPen.Detach();
}
void COS1Dlg::OnView()
{
CStatic *pStat;
CString tp[3],tp1="";
pCurrent=pHead;
while (pCurrent!=NULL)
{
tp[0].Format("%-13d",pCurrent->BaseAddress);
tp[1].Format("%-10d",pCurrent->FreeLength);
tp[2].Format("%-10d",(pCurrent->FreeLength+pCurrent->BaseAddress));
tp1+=tp[0]+tp[1]+tp[2]+"\n";
pCurrent=pCurrent->pNext;
}
pStat = (CStatic *)GetDlgItem(IDC_VIEW);
pStat->SetWindowText(tp1);
pStat->ShowWindow(SW_SHOW);
}
void COS1Dlg::OnBegin()
{
// TODO: Add your command handler code here
//初始化空闲块链表
pHead=NULL;
pHead1=NULL;
CFREEMEM *pnew;
pnew = (CFREEMEM *)(new CFREEMEM);
pnew->BaseAddress=0;
pnew->FreeLength=260000;
pnew->pNext=pHead;
pHead=pnew;
CEdit *pEdit1,*pEdit2;
pEdit1=(CEdit *)GetDlgItem(IDC_PRONAME);
pEdit2=(CEdit *)GetDlgItem(IDC_ALLOCNUM);
pEdit1->SetWindowText("");
pEdit2->SetWindowText("");
CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LISTPRO);
for(int nIndex=pListBox->GetCount()-1;nIndex>=0;nIndex--)
{
delete (CString *)pListBox->GetItemDataPtr(nIndex);
pListBox->DeleteString(nIndex);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -