📄 page.cpp
字号:
// 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 + -