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); 
	} 
	//  
	// 
 
}