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

📄 d3.cpp

📁 操作系统演示程序
💻 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 + -