⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmdlg.cpp

📁 自己写的操作系统的实验:处理机调度模拟及内存分配模拟二合一小程序。
💻 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 + -