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

📄 page.cpp

📁 一个简单的虚拟机和虚拟操作系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Page.cpp : 实现文件
//

#include "stdafx.h"
#include "MyVM.h"
#include "Page.h"
#include "all.h"
#include "VM.h"
#include "CPU.h"
#include "PCB.h"
#include "file.h"
#include "fs.h"
#include "MainDlg.h"
#include "INFDlg.h"
#include "NameDlg.h"
#include "EditDlg.h"
#include "FINFDlg.h"
#include "DINFDlg.h"
#include "DiskINFDlg.h"

CString msg = "";
CString codeErr = "";
extern VM vm;
// CPageProCtrl 对话框

IMPLEMENT_DYNAMIC(CPageProCtrl, CPropertyPage)
CPageProCtrl::CPageProCtrl()
	: CPropertyPage(CPageProCtrl::IDD),selID(-1)
{
}

CPageProCtrl::~CPageProCtrl()
{
}

void CPageProCtrl::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST_PROCESS, lc_proc);
	DDX_Control(pDX, IDC_PROCESS_SWITCH, bt_ProSwitch);
	DDX_Control(pDX, IDC_PROCESS_PAUSE, bt_ProPause);
	DDX_Control(pDX, IDC_PROCESS_STOP, bt_ProStop);
	DDX_Control(pDX, IDC_PROCESS_VIEWINF, bt_ProInf);
	DDX_Control(pDX, IDC_BUTTON_CLOSE, bt_close);
	DDX_Control(pDX, IDC_BUTTON_RESET, bt_reset);
	DDX_Control(pDX, IDC_BUTTON_RESTART, bt_restart);
}


BEGIN_MESSAGE_MAP(CPageProCtrl, CPropertyPage)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnBnClickedButtonClose)
	ON_BN_CLICKED(IDC_BUTTON_RESET, OnBnClickedButtonReset)
	ON_BN_CLICKED(IDC_BUTTON_RESTART, OnBnClickedButtonRestart)
	ON_BN_CLICKED(IDC_PROCESS_SWITCH, OnBnClickedProcessSwitch)
	ON_BN_CLICKED(IDC_PROCESS_PAUSE, OnBnClickedProcessPause)
	ON_BN_CLICKED(IDC_PROCESS_STOP, OnBnClickedProcessStop)
	ON_BN_CLICKED(IDC_PROCESS_VIEWINF, OnBnClickedProcessViewinf)
	ON_WM_SHOWWINDOW()
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_PROCESS, OnNMDblclkListProcess)
END_MESSAGE_MAP()


// CPageProCtrl 消息处理程序

// CPageProEdit 对话框

IMPLEMENT_DYNAMIC(CPageProEdit, CPropertyPage)
CPageProEdit::CPageProEdit()
	: CPropertyPage(CPageProEdit::IDD)
{
}

CPageProEdit::~CPageProEdit()
{
}

void CPageProEdit::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_COMBO1, cb_pri);
}

BEGIN_MESSAGE_MAP(CPageProEdit, CPropertyPage)
	ON_BN_CLICKED(IDC_LOAD, OnBnClickedLoad)
END_MESSAGE_MAP()


// CPageProEdit 消息处理程序

// CPageProOut 对话框

IMPLEMENT_DYNAMIC(CPageProOut, CPropertyPage)
CPageProOut::CPageProOut()
	: CPropertyPage(CPageProOut::IDD)
	, nMem(0)
	, nCPU(0)
	, nActive(0)
	, nReady(0)
	, nA(0)
	, nB(0)
	, nAll(0)
{
}

CPageProOut::~CPageProOut()
{
}

void CPageProOut::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_PROGRESS_MEM, pc_mem);
	DDX_Control(pDX, IDC_PROGRESS_CPU, pc_cpu);
	DDX_Text(pDX, IDC_EDIT_MEM, nMem);
	DDX_Text(pDX, IDC_EDIT_CPU, nCPU);
	DDX_Text(pDX, IDC_EDIT_ACTIVE, nActive);
	DDX_Text(pDX, IDC_EDIT_READY, nReady);
	DDX_Text(pDX, IDC_EDIT_A, nA);
	DDX_Text(pDX, IDC_EDIT_B, nB);
	DDX_Text(pDX, IDC_EDIT_ALL, nAll);
}


BEGIN_MESSAGE_MAP(CPageProOut, CPropertyPage)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_CLEAR, OnBnClickedClear)
END_MESSAGE_MAP()

BOOL CPageProEdit::OnInitDialog()
{
	CPropertyPage::OnInitDialog();

	this->cb_pri.SetCurSel(1);

	return TRUE;
}

void CPageProEdit::OnBnClickedLoad()
{
	UpdateData();
	CString s;
	this->GetDlgItemText(IDC_EDIT1,s);
	try{
		int pri = 0;
		switch(this->cb_pri.GetCurSel())
		{
		case 0:
			pri = PRI_MAX;break;
		case 1:
			pri = PRI_MID;break;
		case 2:
			pri = PRI_MIN;break;
		default:
			throw UNKNOWNERR;
		}
		vm.LoadProcess(s,pri);
	}catch(int e)
	{
		CString msg;
		switch(e)
		{	
		case OUT_OF_MEM:
			msg = "内存溢出!";break;
		case BAD_CODE:
			msg = "代码错误:                               \r\n\r\n";
			msg += codeErr;
			break;
		case TOO_MANY_PRS:
			msg = "进程已满,请稍侯再试。";break;
		default:
			msg = "发生未知错误!";
		}
		MessageBox(msg,NULL,MB_ICONEXCLAMATION|MB_OK);

		return;
	}catch(...)
	{
		MessageBox("发生未知错误!",NULL,MB_ICONEXCLAMATION|MB_OK);
		return;
	}
	((CMainDlg*)GetParent())->SetActivePage(1);
}

BOOL CPageProCtrl::OnInitDialog()
{
	CPropertyPage::OnInitDialog();
	
	lc_proc.SetExtendedStyle(LVS_EX_FULLROWSELECT);
	int i = 0;
	CRect rect;
	lc_proc.GetWindowRect(&rect);
	int width = rect.Width();
	lc_proc.InsertColumn(i++,"ID",LVCFMT_LEFT,45);
	width-=45;
	lc_proc.InsertColumn(i++,"优先级",LVCFMT_LEFT,65);
	width-=65;
	lc_proc.InsertColumn(i++,"内存",LVCFMT_LEFT,65);
	width-=65;
	lc_proc.InsertColumn(i++,"状态",LVCFMT_LEFT,width);

	this->bt_ProPause.EnableWindow(FALSE);
	this->bt_ProStop.EnableWindow(FALSE);
	this->bt_ProSwitch.EnableWindow(FALSE);
	this->bt_ProInf.EnableWindow(FALSE);

	HICON hIcon = ::AfxGetApp()->LoadIcon(IDI_ICON_CLOSE);
	this->bt_close.SetIcon(hIcon);
	hIcon = ::AfxGetApp()->LoadIcon(IDI_ICON_RESET);
	this->bt_reset.SetIcon(hIcon);
	hIcon = ::AfxGetApp()->LoadIcon(IDI_ICON_RESTART);
	this->bt_restart.SetIcon(hIcon);
	
	this->SetTimer(1,CPU_CYC,NULL);
	return TRUE;
}

void CPageProCtrl::OnTimer(UINT nIDEvent)
{
	try{
		vm.Step();
	}catch(int e)
	{
		if(e == DIVIDED_BY_ZERO)
		{
			vm.StopProcess();
			MessageBox("除零溢出,当前进程被终止!","警告",MB_ICONEXCLAMATION|MB_OK);
		}

	}catch(...)
	{
	}
	
	this->bt_ProPause.EnableWindow(FALSE);
	this->bt_ProStop.EnableWindow(FALSE);
	this->bt_ProSwitch.EnableWindow(FALSE);
	this->bt_ProInf.EnableWindow(FALSE);
	POSITION pos = lc_proc.GetFirstSelectedItemPosition();
	int sel = -1;
	if(pos!=NULL)
	sel = lc_proc.GetNextSelectedItem(pos);
	selID = -1;
	lc_proc.DeleteAllItems();
	CString id,pri,mem,state;
	for(int i = 0,row = 0;i<MAX_PRS_NUM;i++)
		if(vm.pcb[i]!=NULL)
		{
			PCB&p = *(vm.pcb[i]);

			id.Format("%d",p.ID);

			switch(p.PRI)
			{
			case PRI_MAX:
				pri = "高";break;
			case PRI_MID:
				pri = "中";break;
			case PRI_MIN:
				pri = "低";break;
			}

			mem.Format("%d",p.PDLR+p.PILR);

			switch(p.STATE)
			{
			case STATE_ACTIVE:
				state = "正在运行";break;
			case STATE_READY:
				state = "就绪";break;
			case STATE_WAIT:
				state = "阻塞";break;
			}
			
			lc_proc.InsertItem(row,id);
			lc_proc.SetItemText(row,1,pri);
			lc_proc.SetItemText(row,2,mem);
			lc_proc.SetItemText(row,3,state);
			if(row++ == sel)
				selID = p.ID;
		}
		if(sel>=0&&selID>=0)
		{
			lc_proc.SetItemState(sel,LVIS_SELECTED,LVIS_SELECTED);
			switch(vm.pcb[selID]->STATE)
				{
				case STATE_ACTIVE:
					this->bt_ProPause.EnableWindow();
					this->bt_ProStop.EnableWindow();
					this->bt_ProInf.EnableWindow();
					break;
				case STATE_READY:
					this->bt_ProStop.EnableWindow();
					this->bt_ProSwitch.EnableWindow();
					this->bt_ProInf.EnableWindow();
					break;
				case STATE_WAIT:
					this->bt_ProPause.EnableWindow();
					this->bt_ProSwitch.EnableWindow();
					break;
				}
		}
				

	CPropertyPage::OnTimer(nIDEvent);
}

BOOL CPageProOut::OnInitDialog()
{
	CPropertyPage::OnInitDialog();
	
	this->SetTimer(1,CPU_CYC,NULL);

	pc_mem.SetRange(0,MEM_SIZE);
	pc_cpu.SetRange(0,100);

	nAll = 0;
	nActive = 0;
	nReady = 0;
	nA = 0;
	nB = 0;	
	
	return TRUE;
}
void CPageProOut::OnTimer(UINT nIDEvent)
{
	//update the output edit
	CString s;
	this->GetDlgItemText(IDC_EDIT1,s);
	if(msg.GetLength()>s.GetLength())
	{
		this->SetDlgItemText(IDC_EDIT1,msg);
		CEdit*edit = (CEdit*)this->GetDlgItem(IDC_EDIT1);
		edit->LineScroll(edit->GetLineCount());
	}

	//update the memory and cpu information
	int usedMem = vm.getMemInUse();
	int cpuRate = vm.getCPURate();
	pc_mem.SetPos(usedMem);
	pc_cpu.SetPos(cpuRate);
	nMem = usedMem;
	nCPU = cpuRate;

	//update the process information
	nAll = vm.getAllNum();
	nActive = vm.getActiveNum();
	nReady = vm.getReadyNum();
	nA = vm.getWaitANum();
	nB = vm.getWaitBNum();	
	
	this->UpdateData(FALSE);

	CPropertyPage::OnTimer(nIDEvent);
}

void CPageProOut::OnBnClickedClear()
{
	msg.Empty();
	this->SetDlgItemText(IDC_EDIT1,msg);
}

void CPageProCtrl::OnBnClickedButtonClose()
{
	int c = IDYES;
	if(vm.getAllNum()!=0)
		c = MessageBox("当前有进程未退出,是否关机?","警告",MB_ICONEXCLAMATION|MB_YESNO);
	if(c == IDYES)
	PostQuitMessage(0);
}

void CPageProCtrl::OnBnClickedButtonReset()
{
	vm.Reset();
}

void CPageProCtrl::OnBnClickedButtonRestart()
{
	int c = IDYES;
	if(vm.getAllNum()!=0)
		c = MessageBox("当前有进程未退出,是否重启?","警告",MB_ICONEXCLAMATION|MB_YESNO);
	if(c == IDYES)
	{
		this->GetParent()->ShowWindow(SW_HIDE);
		vm.Restart();
	}
}

void CPageProCtrl::OnBnClickedProcessSwitch()
{
	if(selID<0||vm.pcb[selID]==NULL)return;
	vm.Q_ready.Put(vm.current);
	vm.PauseProcess();
	vm.StartProcess(selID);
}

void CPageProCtrl::OnBnClickedProcessPause()
{
	if(selID<0||vm.current==NULL)return;
	vm.Q_ready.Put(vm.current);
	vm.PauseProcess();
}

void CPageProCtrl::OnBnClickedProcessStop()
{
	if(selID<0||vm.pcb[selID]==NULL)return;
	vm.StopProcess(selID);
}

void CPageProCtrl::OnBnClickedProcessViewinf()
{
	if(selID<0||vm.pcb[selID]==NULL)return;
	CINFDlg dlg(this,selID);
	dlg.DoModal();
}

void CPageProCtrl::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CPropertyPage::OnShowWindow(bShow, nStatus);
	if(bShow)
	this->SendDlgItemMessage(IDC_LIST_PROCESS,WM_SETFOCUS,0,0);
}

void CPageProCtrl::OnNMDblclkListProcess(NMHDR *pNMHDR, LRESULT *pResult)
{
	this->OnTimer(0);
	this->OnBnClickedProcessViewinf();
	*pResult = 0;
}

IMPLEMENT_DYNAMIC(CPageAbout, CPropertyPage)
CPageAbout::CPageAbout()
	: CPropertyPage(CPageAbout::IDD)
{
}

CPageAbout::~CPageAbout()
{
}

void CPageAbout::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CPageAbout, CPropertyPage)
	ON_BN_CLICKED(IDOK, OnBnClickedOk)
END_MESSAGE_MAP()


// CPageAbout 消息处理程序

void CPageAbout::OnBnClickedOk()
{
	((CMainDlg*)GetParent())->SetActivePage(0);
}// Page.cpp : 实现文件

// CPageFS 对话框

IMPLEMENT_DYNAMIC(CPageFS, CPropertyPage)
CPageFS::CPageFS()
: CPropertyPage(CPageFS::IDD),fs(vm.fs),
selDic(NULL),selFile(NULL),cFather(NULL),
cDic(NULL),cFile(NULL),isCut(false),
canPaste(false),isFile(false)
{
}

CPageFS::~CPageFS()
{
}

void CPageFS::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TREE_FS, m_tree);
	DDX_Control(pDX, IDC_LIST_FS, m_list);
}


BEGIN_MESSAGE_MAP(CPageFS, CPropertyPage)
	ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_FS, OnTvnSelchangedTreeFs)
	ON_NOTIFY(NM_RCLICK, IDC_LIST_FS, OnNMRclickListFs)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_FS, OnNMDblclkListFs)
	ON_BN_CLICKED(IDC_BUTTON_FORMAT, OnBnClickedButtonFormat)
	ON_BN_CLICKED(IDC_BUTTON_DISK, OnBnClickedButtonDisk)
	ON_BN_CLICKED(IDC_BUTTON_UP, OnBnClickedButtonUp)
//	ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_FS, OnLvnEndlabeleditListFs)
END_MESSAGE_MAP()


// CPageFS 消息处理程序

BOOL CPageFS::OnInitDialog()
{
	CPropertyPage::OnInitDialog();

	imgTree.Create(IDB_BITMAP_TREE,16,1,RGB(255,255,255));
	m_tree.SetImageList(&imgTree,TVSIL_NORMAL);
	InsertNode(TVI_ROOT,fs.getRoot());

	imgList.Create(IDB_BITMAP_LIST,32,1,RGB(255,255,255));
	m_list.SetImageList(&imgList,TVSIL_NORMAL);
	SetView(fs.getRoot());
	
	return TRUE;
}
void CPageFS::DeleteNode(HTREEITEM root,const Dictionary*dic)
{
	HTREEITEM item = root;
	if(m_tree.GetItemData(item) == (DWORD)dic)
	{
		m_tree.DeleteItem(item);
		return;
	}
	
	item = m_tree.GetChildItem(item);
	while(item!=NULL)
	{
		DeleteNode(item,dic);
		item = m_tree.GetNextItem(item,TVGN_NEXT);
	}
}
void CPageFS::InsertNode(HTREEITEM father,const Dictionary*dic)
{
	HTREEITEM item;
	item = m_tree.InsertItem(dic->getName(),0,1,father,TVI_SORT);
	m_tree.SetItemData(item,(DWORD_PTR)dic);

	int size = dic->getDcount();
	if(size == 0)
		return;
	Dictionary**d = new Dictionary*[size];
	dic->enumDics(d);
	for(int i = 0;i<size;i++)
	InsertNode(item,d[i]);
	delete[]d;
	m_tree.RedrawWindow();
}
void CPageFS::SetView(const Dictionary*dic)
{
	selFile = NULL;
	selDic = NULL;
	m_list.DeleteAllItems();	

	int size = dic->getFcount();
	if(size>0)
	{
		File**f = new File*[size];
		dic->enumFiles(f);
		for(int i = 0;i<size;i++)
			m_list.InsertItem(0,f[i]->getName(),1);
	}
	
	size = dic->getDcount();
	if(size>0)
	{
		Dictionary**d = new Dictionary*[size];
		dic->enumDics(d);
		for(int i = 0;i<size;i++)
			m_list.InsertItem(0,d[i]->getName(),0);
	}
}
bool CPageFS::GetSelectName(CString&s)
{
	POSITION pos = m_list.GetFirstSelectedItemPosition();
	if(pos==NULL)
		return false;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -