www.pudn.com > OSDemo.rar > 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 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;colm_resnum),sizeof(int));
UpdateData(false);
OnSetNum();
for(int i=0;i