📄 d3.cpp
字号:
// D3.cpp : implementation file
//
#include "stdafx.h"
#include "OSDemo.h"
#include "D3.h"
#include "safecheck.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CD3 dialog
CD3::CD3(CWnd* pParent /*=NULL*/)
: CDialog(CD3::IDD, pParent)
{
//{{AFX_DATA_INIT(CD3)
m_resnum = 0;
//}}AFX_DATA_INIT
m_procnum = 0;
}
void CD3::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CD3)
DDX_Control(pDX, IDC_SAVE, m_save_ctrl);
DDX_Control(pDX, IDC_LOAD, m_load_ctrl);
DDX_Control(pDX, IDC_REQUEST, m_request_ctrl);
DDX_Control(pDX, IDC_OUT, m_out_ctrl);
DDX_Control(pDX, IDC_PROC, m_proc_ctrl);
DDX_Control(pDX, IDC_SETNUM, m_setnum_ctrl);
DDX_Control(pDX, IDC_REMOVE, m_remove_ctrl);
DDX_Control(pDX, IDC_ADD, m_add_ctrl);
DDX_Control(pDX, IDC_NUM, m_num_ctrl);
DDX_Text(pDX, IDC_NUM, m_resnum);
//}}AFX_DATA_MAP
DDX_GridControl(pDX, IDC_LIST, m_GridCtrl);
DDX_GridControl(pDX, IDC_LIST2, m_avlist);
DDX_GridControl(pDX, IDC_LIST3, m_reqlist);
}
BEGIN_MESSAGE_MAP(CD3, CDialog)
//{{AFX_MSG_MAP(CD3)
ON_BN_CLICKED(IDC_SETNUM, OnSetNum)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_REMOVE, OnRemove)
ON_BN_CLICKED(IDC_PROC, OnProc)
ON_BN_CLICKED(IDC_REQUEST, OnRequest)
ON_BN_CLICKED(IDC_SAVE, OnSave)
ON_BN_CLICKED(IDC_LOAD, OnLoad)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CD3 message handlers
void CD3::EnabeControls()
{
this->UpdateData();
if(m_resnum<=0)
{
m_add_ctrl.EnableWindow(false);
m_remove_ctrl.EnableWindow(false);
m_proc_ctrl.EnableWindow(false);
m_setnum_ctrl.EnableWindow(true);
m_reqlist.EnableWindow(false);
m_request_ctrl.EnableWindow(false);
m_load_ctrl.EnableWindow(true);
m_save_ctrl.EnableWindow(false);
return;
}
else
{
m_add_ctrl.EnableWindow(true);
m_setnum_ctrl.EnableWindow(false);
m_num_ctrl.EnableWindow(false);
m_load_ctrl.EnableWindow(false);
}
if(m_procnum>0)
{
m_remove_ctrl.EnableWindow(true);
m_proc_ctrl.EnableWindow(true);
m_reqlist.EnableWindow(true);
m_request_ctrl.EnableWindow(true);
m_save_ctrl.EnableWindow(true);
}
else
{
m_remove_ctrl.EnableWindow(false);
m_proc_ctrl.EnableWindow(false);
m_reqlist.EnableWindow(false);
m_request_ctrl.EnableWindow(false);
m_save_ctrl.EnableWindow(false);
}
}
BOOL CD3::OnInitDialog()
{
CDialog::OnInitDialog();
m_GridCtrl.SetRowCount(1);
m_GridCtrl.SetFixedRowCount(1);
m_GridCtrl.SetColumnCount(1);
m_GridCtrl.SetFixedColumnCount(1);
m_GridCtrl.SetColumnResize(FALSE);
m_GridCtrl.SetRowResize(FALSE);
m_avlist.SetRowCount(2);
m_avlist.SetFixedRowCount(1);
m_avlist.SetColumnCount(0);
m_avlist.SetFixedColumnCount(0);
m_avlist.SetColumnResize(FALSE);
m_avlist.SetRowResize(FALSE);
m_reqlist.SetComboBoxStyle(CBS_DROPDOWNLIST);
m_reqlist.SetRowCount(2);
m_reqlist.SetFixedRowCount(1);
m_reqlist.SetColumnCount(1);
m_reqlist.SetFixedColumnCount(0);
m_reqlist.SetColumnResize(FALSE);
m_reqlist.SetRowResize(FALSE);
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = 0;
Item.col = 0;
Item.szText = _T("进程号");
m_GridCtrl.SetItem(&Item);
m_reqlist.SetItem(&Item);
m_reqlist.AutoSizeColumns();
m_reqlist.EnableWindow(false);
// fill rows/cols with text
/*
for (int row = 0; row < m_GridCtrl.GetRowCount(); row++)
for (int col = 0; col < m_GridCtrl.GetColumnCount(); col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
if (row < 1 ) {
if(col>0)
{
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.szText.Format(_T("Column %d"),col);
}
} else if (col < 1 ) {
Item.nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.szText.Format(_T("Row %d"),row);
} else {
// Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
// Item.szText.Format(_T("%d"),row*col);
}
m_GridCtrl.SetItem(&Item);
}
*/
m_GridCtrl.AutoSize();
return TRUE; // return TRUE unless you set the focus to a control
}
void CD3::OnSetNum()
{
// TODO: Add your control notification handler code here
this->UpdateData(TRUE);
if(m_resnum<=0)
{
MessageBox("错误的资源数!","错误",MB_OK|MB_ICONERROR);
}
m_GridCtrl.SetColumnCount(m_resnum*2+1);
int row=0;
for (int col = 1; col <=m_resnum; col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.szText.Format(_T("资源%d(已分配)"),col);
m_GridCtrl.SetItem(&Item);
}
for (col = m_resnum+1; col <=m_resnum*2; col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.szText.Format(_T("资源%d(最大需求)"),col-m_resnum);
m_GridCtrl.SetItem(&Item);
}
m_GridCtrl.AutoSize();
m_avlist.SetColumnCount(m_resnum);
for (col = 0; col <m_resnum; col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = 0;
Item.col = col;
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.szText.Format(_T("资源%d"),col+1);
m_avlist.SetItem(&Item);
}
m_avlist.AutoSizeColumns();
m_reqlist.SetColumnCount(m_resnum+1);
for (col = 1; col <m_resnum+1; col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = 0;
Item.col = col;
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.szText.Format(_T("资源%d"),col);
m_reqlist.SetItem(&Item);
}
m_reqlist.AutoSizeColumns();
EnabeControls();
}
void CD3::OnAdd()
{
// TODO: Add your control notification handler code here
m_procnum++;
m_GridCtrl.SetRowCount(m_procnum+1);
int row=m_procnum;
int col=0;
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.szText.Format(_T("进程%d"),row);
m_GridCtrl.SetItem(&Item);
m_GridCtrl.AutoSize();
EnabeControls();
}
void CD3::OnRemove()
{
m_procnum--;
m_GridCtrl.SetRowCount(m_procnum+1);
EnabeControls();
}
void CD3::OnProc()
{
// TODO: Add your control notification handler code here
int *alloc = new int[m_resnum*m_procnum];
int *max = new int[m_resnum*m_procnum];
int *need = new int[m_resnum*m_procnum];
int *available = new int[m_resnum];
int data;
for(int col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
data=GetData(m_GridCtrl,row+1,col+1);
if(data<0)
{
delete alloc;
delete need;
delete available;
delete max;
MessageBox("缺少数据或数据出错!","错误!",MB_OK|MB_ICONERROR);
return;
}
alloc[row*m_resnum+col]=data;
}
}
for(col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
data=GetData(m_GridCtrl,row+1,col+m_resnum+1);
if(data<0||data<*(alloc+row*m_resnum+col))
{
delete alloc;
delete need;
delete available;
delete max;
MessageBox("缺少数据或数据出错!","错误!",MB_OK|MB_ICONERROR);
return;
}
max[row*m_resnum+col]=data;
}
}
for(col=0;col<m_resnum;col++)
{
int row=1;
data=GetData(m_avlist,row,col);
if(data<0)
{
delete alloc;
delete need;
delete available;
delete max;
CString msg;
MessageBox("缺少数据或数据出错!","错误!",MB_OK|MB_ICONERROR);
return;
}
available[col]=data;
}
for(col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
need[row*m_resnum+col]=max[row*m_resnum+col]-alloc[row*m_resnum+col];
}
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//处理矩阵
SafeChecker chk;
chk.SetMatrix(alloc,need,available,m_procnum,m_resnum);
CString msg=chk.GetResult();
// MessageBox(msg);
m_out_ctrl.SetWindowText(msg);
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
delete[] alloc;
delete[] need;
delete[] available;
delete[] max;
}
//提取数据如果不是数字返回-1
int CD3::GetData(CGridCtrl &gc, int row, int col)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT;
Item.row = row;
Item.col = col;
gc.GetItem(&Item);
CString str=Item.szText;
if(str=="")
{
return -1;
}
if(str.GetBuffer(20)[0]!='0'&&atoi(str)==0)
{
return -1;
}
return atoi(str);
}
void CD3::SetData(CGridCtrl &gc,int row, int col, int data)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.szText.Format(_T("%d"),data);
gc.SetItem(&Item);
}
void CD3::OnRequest()
{
// TODO: Add your control notification handler code here
int *alloc = new int[m_resnum*m_procnum];
int *max = new int[m_resnum*m_procnum];
int *need = new int[m_resnum*m_procnum];
int *available = new int[m_resnum];
int data;
for(int col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
data=GetData(m_GridCtrl,row+1,col+1);
if(data<0)
{
delete alloc;
delete need;
delete available;
delete max;
MessageBox("已分配资源:缺少数据或数据出错!","错误!",MB_OK|MB_ICONERROR);
return;
}
alloc[row*m_resnum+col]=data;
}
}
for(col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
data=GetData(m_GridCtrl,row+1,col+m_resnum+1);
if(data<0||data<*(alloc+row*m_resnum+col))
{
delete alloc;
delete need;
delete available;
delete max;
MessageBox("最大需求资源:缺少数据或数据出错!","错误!",MB_OK|MB_ICONERROR);
return;
}
max[row*m_resnum+col]=data;
}
}
for(col=0;col<m_resnum;col++)
{
int row=1;
data=GetData(m_avlist,row,col);
if(data<0)
{
delete alloc;
delete need;
delete available;
delete max;
MessageBox("可用资源数:缺少数据或数据出错!","错误!",MB_OK|MB_ICONERROR);
return;
}
available[col]=data;
}
int *request=new int[m_resnum];
int nProc;
for(col=0;col<m_resnum+1;col++)
{
int row=1;
data=GetData(m_reqlist,row,col);
if(data<0||(col!=0&&data>available[col-1]))
{
delete alloc;
delete need;
delete available;
delete max;
delete request;
MessageBox("资源请求:缺少数据或数据出错!","错误!",MB_OK|MB_ICONERROR);
return;
}
if(col==0)
{
if(data>m_procnum)
{
delete alloc;
delete need;
delete available;
delete max;
delete request;
MessageBox("进程号错误!","错误!",MB_OK|MB_ICONERROR);
return;
}
nProc=data-1;
}
else
{
request[col-1]=data;
}
}
//计算need 处理request
for(col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
if(row==nProc)
{
alloc[row*m_resnum+col]+=request[col];
available[col]-=request[col];
}
need[row*m_resnum+col]=max[row*m_resnum+col]-alloc[row*m_resnum+col];
}
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//处理矩阵
SafeChecker chk;
chk.SetMatrix(alloc,need,available,m_procnum,m_resnum);
CString msg=chk.GetResult();
// MessageBox(msg);
if(msg=="不存在安全序列!")
m_out_ctrl.SetWindowText(_T("不能立即分配请求的资源!"));
else
m_out_ctrl.SetWindowText(_T("可以立即分配请求的资源!"));
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
delete[] alloc;
delete[] need;
delete[] available;
delete[] max;
delete[] request;
}
void CD3::OnSave()
{
// TODO: Add your control notification handler code here
CFileDialog fd(false,"*.dat","list.dat",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Data Files (*.dat)|*.dat|All Files (*.*)|*.*||");
fd.DoModal();
CString szPath=fd.GetPathName();
CFile file;
if(!file.Open(szPath,CFile::modeCreate | CFile::modeWrite))
{
MessageBox("保存失败!","提示",MB_ICONINFORMATION);
return;
}
int *alloc = new int[m_resnum*m_procnum];
int *max = new int[m_resnum*m_procnum];
int *available = new int[m_resnum];
int data;
for(int col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
data=GetData(m_GridCtrl,row+1,col+1);
alloc[row*m_resnum+col]=data;
}
}
for(col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
data=GetData(m_GridCtrl,row+1,col+m_resnum+1);
max[row*m_resnum+col]=data;
}
}
for(col=0;col<m_resnum;col++)
{
int row=1;
data=GetData(m_avlist,row,col);
available[col]=data;
}
file.Write(&m_procnum,sizeof(int));
file.Write(&m_resnum,sizeof(int));
file.Write(alloc,m_resnum*m_procnum*sizeof(int));
file.Write(max,m_resnum*m_procnum*sizeof(int));
file.Write(available,m_resnum*sizeof(int));
file.Close();
delete[] alloc;
delete[] available;
delete[] max;
}
void CD3::OnLoad()
{
// TODO: Add your control notification handler code here
CFileDialog fd(true,"*.dat","list.dat",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Data Files (*.dat)|*.dat|All Files (*.*)|*.*||");
fd.DoModal();
CString szPath=fd.GetPathName();
CFile file;
if(!file.Open(szPath,CFile::modeRead))
{
MessageBox("读取失败!","提示",MB_ICONINFORMATION);
return;
}
int procnum;
file.Read(&procnum,sizeof(int));
file.Read(&(this->m_resnum),sizeof(int));
UpdateData(false);
OnSetNum();
for(int i=0;i<procnum;i++)
{
OnAdd();
}
int *alloc = new int[m_resnum*m_procnum];
int *max = new int[m_resnum*m_procnum];
int *available = new int[m_resnum];
file.Read(alloc,m_resnum*m_procnum*sizeof(int));
file.Read(max,m_resnum*m_procnum*sizeof(int));
file.Read(available,m_resnum*sizeof(int));
file.Close();
for(int col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
SetData(m_GridCtrl,row+1,col+1,alloc[row*m_resnum+col]);
}
}
for(col=0;col<m_resnum;col++)
{
for(int row=0;row<m_procnum;row++)
{
SetData(m_GridCtrl,row+1,col+m_resnum+1,max[row*m_resnum+col]);
}
}
for(col=0;col<m_resnum;col++)
{
int row=1;
SetData(m_avlist,row,col,available[col]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -