www.pudn.com > OSDemo.rar > Tab1.cpp
// Tab1.cpp : implementation file
//
#include "stdafx.h"
#include "OSDemo.h"
#include "Tab1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTab1 dialog
CTab1::CTab1(CWnd* pParent /*=NULL*/)
: CDialog(CTab1::IDD, pParent)
{
//{{AFX_DATA_INIT(CTab1)
m_NeedMem = _T("");
m_NeedTime = _T("");
m_ReqMem = 0;
m_ReqTime = 0;
m_StartMsg = _T("");
//}}AFX_DATA_INIT
}
void CTab1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTab1)
DDX_Control(pDX, IDC_TIME_SLIDER, m_TimeSlider);
DDX_Control(pDX, IDC_TAB_VIEW, m_TabView);
DDX_Control(pDX, IDC_COMBO_TAPE, m_Combo2);
DDX_Control(pDX, IDC_COMBO_PRINTER, m_Combo1);
DDX_Control(pDX, IDC_MEMLIST, m_MemList);
DDX_Control(pDX, IDC_JOBLIST, m_JobList);
DDX_Text(pDX, IDC_NEED_MEM, m_ReqMem);
DDV_MinMaxUInt(pDX, m_ReqMem, 5, 100);
DDX_Text(pDX, IDC_NEED_TIME, m_ReqTime);
DDV_MinMaxUInt(pDX, m_ReqTime, 5, 30);
DDX_Text(pDX, IDC_START, m_StartMsg);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTab1, CDialog)
//{{AFX_MSG_MAP(CTab1)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_TIME_SLIDER, OnReleasedcaptureTimeSlider)
ON_BN_CLICKED(IDC_TIME_ADD, OnTimeAdd)
ON_BN_CLICKED(IDC_TIME_DEC, OnTimeDec)
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_RUN, OnBtnRun)
ON_BN_CLICKED(IDC_BTN_DEL, OnBtnDel)
ON_WM_CONTEXTMENU()
ON_COMMAND(IDR_MNU_REDO, OnMnuRedo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTab1 message handlers
BOOL CTab1::OnInitDialog()
{
CDialog::OnInitDialog();
CurJobNum=0;
DWORD dwStyle1 = m_JobList.GetExtendedStyle();
ListView_SetExtendedListViewStyle(m_JobList.m_hWnd, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
DWORD dwStyle2 = m_MemList.GetExtendedStyle();
ListView_SetExtendedListViewStyle(m_MemList.m_hWnd, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_JobList.InsertColumn(0,"作业号",LVCFMT_LEFT,50);
m_JobList.InsertColumn(1,"输入时间",LVCFMT_CENTER,80);
m_JobList.InsertColumn(2,"要求计算时间",LVCFMT_CENTER,80);
m_JobList.InsertColumn(3,"占用内存",LVCFMT_CENTER,80);
m_JobList.InsertColumn(4,"磁带机数量",LVCFMT_CENTER,80);
m_JobList.InsertColumn(5,"打印机数量",LVCFMT_CENTER,80);
m_MemList.InsertColumn(0,"时间",LVCFMT_LEFT,35);
m_MemList.InsertColumn(1,"块大小",LVCFMT_LEFT,50);
m_MemList.InsertColumn(2,"首址",LVCFMT_LEFT,50);
m_TimeSlider.SetRange(0,60);
m_TimeSlider.SetTicFreq(5);
m_StartMsg="作业输入时刻: 8:00";
((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1))->SetRange(5,30);
((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN2))->SetRange(5,100);
m_Combo1.SetCurSel(0);
m_Combo2.SetCurSel(0);
m_ReqMem=5;
m_ReqTime=5;
ItemCount=0;
m_TabView.AddPage("作业运行图", &m_TabJob, IDD_TAB_JOB);
m_TabView.AddPage("内存分配图", &m_TabMem, IDD_TAB_MEM);
m_TabView.Show();
FreeAllMem();
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CTab1::OnReleasedcaptureTimeSlider(NMHDR* pNMHDR, LRESULT* pResult)
{
ShowStartTime();
*pResult = 0;
}
void CTab1::OnTimeAdd()
{
int nPos=m_TimeSlider.GetPos();
m_TimeSlider.SetPos(nPos+5);
ShowStartTime();
}
void CTab1::ShowStartTime()
{
int nPos=m_TimeSlider.GetPos();
if (nPos<10)
m_StartMsg.Format("作业输入时刻:8:0%d",nPos);
else
m_StartMsg.Format("作业输入时刻:8:%d",nPos);
if (nPos==60) m_StartMsg="作业输入时刻:9:00";
UpdateData(false);
}
void CTab1::OnTimeDec()
{
// TODO: Add your control notification handler code here
int nPos=m_TimeSlider.GetPos();
m_TimeSlider.SetPos(nPos-5);
ShowStartTime();
}
void CTab1::OnBtnAdd()
{
UpdateData(true);
if (JCBList.GetSize()>=5)
{
MessageBox("为了便于演示,本程序最多只能支持5个作业!","提示:",MB_ICONINFORMATION);
return;
}
JCB NewJob;
//JCBList NewJob;
CString PrintNum;
CString TapeNum;
NewJob.ID=JCBList.GetSize()+1;
m_Combo1.GetWindowText(PrintNum);
NewJob.PrintNum=atoi(PrintNum);
m_Combo2.GetWindowText(TapeNum);
NewJob.TapeNum=atoi(TapeNum);
NewJob.TakeMem=m_ReqMem;
NewJob.TakeTime=(float)m_ReqTime;
NewJob.RunTime=m_TimeSlider.GetPos();
JCBList.Add(NewJob);
ShowJobList();
}
void CTab1::ShowJobList()
{
CString id;
CString RunTime;
CString TakeMem;
CString TakeTime;
CString PrintNum;
CString TapeNum;
m_JobList.DeleteAllItems();
for(int i=0;i0 || (JCBWait.GetSize())>0 || (JCBRun.GetSize())>0)
{
i=0;
while (iJCBRun[i].SetTime)
m_TabJob.DrawDotRect(60+JCBRun[i].SetTime*5,25*JCBRun[i].ID,(JCBRun[i].RunTime-JCBRun[i].SetTime)*5,JobColor[JCBRun[i].ID-1]);
m_TabJob.DrawRect(60+JCBRun[i].RunTime*5,25*JCBRun[i].ID,(CountTime-JCBRun[i].RunTime)*5,JobColor[JCBRun[i].ID-1],"");
m_TabMem.DrawRect(60+JCBRun[i].RunTime*5,25+1.8*(TOTAL_MEM-(JCBRun[i].TakeMem+JCBRun[i].MemSize-1)),(CountTime-JCBRun[i].RunTime)*5,JCBRun[i].MemSize*1.8,JobColor[JCBRun[i].ID-1],crText);
m_TabMem.AddPiece(JobColor[JCBRun[i].ID-1],(float)JCBRun[i].MemSize/100*360,crText);
m_TabJob.SumTime+=CountTime-JCBRun[i].RunTime;
m_TabJob.AveTime++;
if (JCBRun[i].PrintNum>0 || JCBRun[i].TapeNum>0)
{
for (int j=0;j<3;j++)
{
if (RCList[j].User==(int)JCBRun[i].ID)
{
crText.Format("%d",RCList[j].User);
m_TabJob.DrawRect(60+JCBRun[i].RunTime*5,RCList[j].yPos,(CountTime-JCBRun[i].RunTime)*5,RCList[j].tagColor,crText);
RCList[j].User=-1;
}
}
}
free_block(JCBRun[i].TakeMem,JCBRun[i].MemSize);
nTaper+=JCBRun[i].TapeNum;
nPrinter+=JCBRun[i].PrintNum;
ShowMemList();
JCBRun.RemoveAt(i);
i--;
}
i++;
}
i=0;
while (i0 && FBTList[i].size=FBTList.GetSize()) return 0;
p=FBTList[i].addr+FBTList[i].size-NeedSize;
FBTList[i].size-=NeedSize;
//MessageBox("get_block1");
ShowMemList();
return p; //返回分得的内存块首址
}
bool CTab1::free_block(int addr,int size) //回收已分配的内存并修改自由区表
{
bool flag=false;
int i=0;
int nIndex;
while (iTOTAL_MEM+1)
return false;
else
{
FBTList[i].size+=size;
addr=FBTList[i].addr; //修改回收首址为后并后的首址以防块上下都有接区。
size=FBTList[i].size;
flag=true;
nIndex=i;
}
}
i++;
}
i=0;
while (iTOTAL_MEM+1) return false; //要回收的首址加长度超过内存总长,错误返回。
FBT MemBlock;
MemBlock.addr=addr;
MemBlock.size=size;
FBTList.Add(MemBlock); //在自由区表添加新块
return true;
}
bool CTab1::IsMemEnough(int size) //判断内存自由区是否足够
{
for (int i=0;i=(UINT)size)
return true;
}
return false;
}
bool CTab1::Apply_HardWare(UINT type,UINT user) //申请打印机或磁带机资源
{
for(int i=0;i<3;i++)
{
if ((RCList[i].Type==type) && (RCList[i].User==-1))
{
RCList[i].User=user;
return true;
}
}
return false;
}
void CTab1::OnContextMenu(CWnd* pWnd, CPoint point)
{
if (point.x == -1 && point.y == -1){
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_POP_MNU1));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
//while (pWndPopupOwner->GetStyle() & WS_CHILD)
// pWndPopupOwner = pWndPopupOwner->GetParent();
TrackSkinPopupMenu( pPopup->m_hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner->m_hWnd );
}
void CTab1::OnMnuRedo()
{
FreeAllMem();
if (m_TabView.GetCurSel()==0)
{
m_TabJob.ShowWindow(SW_HIDE);
m_TabJob.ShowWindow(SW_SHOW);
}
else
{
m_TabMem.ShowWindow(SW_HIDE);
m_TabMem.ShowWindow(SW_SHOW);
}
//
//
}