📄 mmdlg.cpp
字号:
// mmDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "schedul_mfc.h"
#include "mmDlg.h"
#include ".\mmdlg.h"
#include <cstdlib> //for srand() and rand()
// CmmDlg 对话框
IMPLEMENT_DYNAMIC(CmmDlg, CDialog)
CmmDlg::CmmDlg(CWnd* pParent /*=NULL*/)
: CDialog(CmmDlg::IDD, pParent)
, m_allmemory(_T(""))
, m_usedmemory(_T(""))
, m_remainmemory(_T(""))
, m_nextp(_T(""))
, m_nneedm(_T(""))
, m_nextstatas(_T(""))
{
}
CmmDlg::~CmmDlg()
{
}
void CmmDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_STATIC_ALLMEMORY, m_allmemory);
DDX_Text(pDX, IDC_STATIC_USEDMEMORY2, m_usedmemory);
DDX_Text(pDX, IDC_STATIC_REMAINMEMORY, m_remainmemory);
DDX_Text(pDX, IDC_STATIC_NEXTP, m_nextp);
DDX_Text(pDX, IDC_STATIC_NNEEDM, m_nneedm);
DDX_Text(pDX, IDC_STATIC_NEXTSATAS, m_nextstatas);
}
BEGIN_MESSAGE_MAP(CmmDlg, CDialog)
ON_WM_PAINT()
ON_BN_CLICKED(IDOK, OnBnClickedOk)
END_MESSAGE_MAP()
// CmmDlg 消息处理程序
void CmmDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
byte red=255;
byte green=0;
byte blue=0;
int allm=MM_TOTAL_SIZE;
int usedm=0;
CRect rc(20,20,124,221);
dc.Rectangle(&rc);
rc.left+=1;
rc.right-=1;
CString str;
Cpcb* p=pshd->active.head;
SetBkMode(dc,TRANSPARENT);
CFont font;
font.CreateFont(
12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
"Arial");
CFont* def_font = dc.SelectObject(&font);
str.Format("%d",100);
dc.TextOut(rc.left-14,rc.bottom-6,str);
//显示就绪队列中进程内存块信息
for(p;p!=pshd->active.end;p=p->nextp)
{
int height=2*(p->memory);
int y=21+2*(p->mm_begin);
rc.top=y;
rc.bottom=y+height;
//设置内存块颜色
srand(y);
red=(byte)rand()%50+200;
green=(byte)rand()%100+100;
blue=(byte)rand()%100;
CBrush br(RGB(red,green,blue));
dc.FillRect(&rc,&br);
//在内存块中显示相应进程信息
str.Format("PID:%d P:%d T:%d-%d M:%d",p->pid,p->priority,p->time_slice,p->time_ran,p->memory);
dc.TextOut(rc.left+4,y+height/2-4,str);
str.Format("%d",p->mm_begin);
dc.TextOut(rc.left-10,y-4,str);
usedm+=p->memory;
}
//显示挂起队列中进程块内存信息
COLORREF crf=dc.SetTextColor(RGB(0,0,255));
for(p=pshd->hang.head;p!=pshd->hang.end;p=p->nextp)
{
int height=2*(p->memory);
int y=21+2*(p->mm_begin);
rc.top=y;
rc.bottom=y+height;
//设置内存块颜色
srand(y);
red=(byte)rand()%50+200;
green=(byte)rand()%100+100;
blue=(byte)rand()%100;
CBrush br(RGB(red,green,blue));
dc.FillRect(&rc,&br);
//在内存块中显示相应进程信息
str.Format("PID:%d P:%d T:%d-%d M:%d",p->pid,p->priority,p->time_slice,p->time_ran,p->memory);
dc.TextOut(rc.left+4,y+height/2-4,str);
str.Format("%d",p->mm_begin);
dc.TextOut(rc.left-10,y-4,str);
usedm+=p->memory;
}
dc.SetTextColor(crf);
str.Format("系统总内存: %d",allm);
m_allmemory=str;
str.Format("已使用内存: %d",usedm);
m_usedmemory=str;
str.Format("还剩下内存: %d",allm-usedm);
m_remainmemory=str;
if( pshd->reserve.count )
{
str.Format("下一个进程: PID= %d",pshd->reserve.head->pid );
m_nextp=str;
str.Format("其所需内存: %d",pshd->reserve.head->memory );
m_nneedm=str;
if( ((int)pshd->reserve.head->memory)>allm-usedm )
m_nextstatas="PS:内存不足,未被调度";
else
m_nextstatas="PS:进程已满,等待调度";
}
else
{
m_nextp="";
m_nneedm="";
m_nextstatas="";
}
UpdateData(0);
dc.SelectObject(def_font);
font.DeleteObject();
// 不为绘图消息调用 CDialog::OnPaint()
}
void CmmDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -