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

📄 promoni.cpp

📁 本程序使用VC++编译调试
💻 CPP
字号:
// ProMoni.cpp: implementation of the CProMoni class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Process.h"
#include "ProMoni.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CProMoni::CProMoni()
{
	m_pRunning=NULL;
	m_finish=false;
	m_clock=0;
	m_LogFileName="Log.txt";//初始化日志文件名
}
CProMoni::~CProMoni()
{
	delete m_pRunning;
	m_readyList.RemoveAll();
	m_finishList.RemoveAll();
	
}
void CProMoni::InsertRQ(PCB* p)
{	//将p插入到就绪队列中
	POSITION pre,pos=m_readyList.GetHeadPosition();
	PCB *q;
	while(pos!=NULL)
	{
		pre=pos;
		q=(PCB*)m_readyList.GetNext(pos);//函数执行后pos 可能已经为NULL,所以在执行m_readyList.GetPrev(pos);可能出错
		if(q->pri < p->pri)
		{
			m_readyList.InsertBefore(pre,p);
			return;
		}
	}
	if(pos==NULL)
	{
		m_readyList.AddTail(p);
	}
}
void CProMoni::InsertFQ(PCB* p)
{//将p插入到完成队列中
	m_finishList.AddTail(p);
}

bool CProMoni::GetFinishFlag()
{ 
	return m_finish;
}

void CProMoni::ProSchedule()
{//进程调度
		
//	WriteLogToFile();

	PCB *p;
	if(m_pRunning==NULL)
	{
		if(m_readyList.IsEmpty())
		{
			m_finish=true;
			return;
		}
		else
		{
			p=(PCB*)m_readyList.RemoveHead();
			m_pRunning=p;
			m_pRunning->status=1;
		}
	}
	else
	{	
		if(!m_readyList.IsEmpty())
		{
			p=(PCB*)m_readyList.GetHead();
			//m_readyList将头节点与当前PCB的权值比较
			if(p->pri > m_pRunning->pri )
			{
				PCB *q=m_pRunning;
				m_pRunning=(PCB*)m_readyList.RemoveHead();
				m_pRunning->status=1;
				q->status=0;
				InsertRQ(q);
			}
		}
	}
}

void CProMoni::ProRun()
{//运行进程
	if(!m_finish)
	{
		if(m_pRunning==NULL)
		{
			AfxMessageBox("当前运行的进程不存在!");
			return;
		}

		m_pRunning->pri-=3;
		m_pRunning->time-=1;

		if(m_pRunning->time <= 0 )
		{
			m_pRunning->time=0;
			PCB*p=m_pRunning;
			p->status=-1;
			InsertFQ(p);
			m_pRunning=NULL;
		}
	}
}

void CProMoni::Display(CDC* pDC)
{//以表格形式输出进程调度过程
	int TOP=50,LEFT=30;
	int H=40,W=80;
	int row=1;
	int x_rf=LEFT+10,  y_rf=TOP+H+5;

	int R_num,F_num;
	R_num=m_readyList.GetCount();
	F_num=m_finishList.GetCount();
	row=R_num+F_num;

	if(m_pRunning != NULL)
	{
		row+=1;
		y_rf+=H;
	}
	int right,bottom;
	right=LEFT+4*W;
	bottom=TOP+row*H+H;

	CPen *oldPen,linePen;
	linePen.CreatePen(PS_SOLID,2,RGB(100,100,50));
	oldPen=pDC->SelectObject(&linePen);

	for(int r=0;r<=row+1;r++)
	{	//画横线
		pDC->MoveTo(LEFT,TOP+r*H);
		pDC->LineTo(right,TOP+r*H);
	}

	for(int col=0;col<=4;col++)
	{	//画竖线
		pDC->MoveTo(LEFT+col*W, TOP);
		pDC->LineTo(LEFT+col*W, bottom);
	}
	pDC->SelectObject(oldPen);

	COLORREF oldColor,titleColor,runColor,readyColor,finishColor;
	titleColor=RGB(10,50,150);
	runColor=RGB(255,0,0);
	readyColor=RGB(150,50,50);
	finishColor=RGB(155,100,0);;

	oldColor=pDC->SetTextColor(titleColor);

	pDC->TextOut(LEFT+10,TOP+5,"进程ID");
	pDC->TextOut(LEFT+W+10,TOP+5,"优先数");
	pDC->TextOut(LEFT+W*2+10,TOP+5,"剩余时间");
	pDC->TextOut(LEFT+W*3+10,TOP+5,"进程状态");

	CString strID,strPri,strTime,strStatus;
	if(m_pRunning !=NULL)
	{
		strID.Format("%d",m_pRunning->pid);
		strPri.Format("%d",m_pRunning->pri);
		strTime.Format("%d",m_pRunning->time);
		strStatus="正在执行";

		pDC->SetTextColor(runColor);
		pDC->TextOut(LEFT+10,TOP+H+5,strID);
		pDC->TextOut(LEFT+W+10,TOP+H+5,strPri);
		pDC->TextOut(LEFT+2*W+10,TOP+H+5,strTime);
		pDC->TextOut(LEFT+3*W+10,TOP+H+5,strStatus);
	}
	
	POSITION pos;
	PCB *p;
	pos=m_readyList.GetHeadPosition();
	int i;
		
	pDC->SetTextColor(readyColor);
	for(i=0;i<R_num;i++)
	{
		p=(PCB*)m_readyList.GetNext(pos);
		strID.Format("%d",p->pid);
		strPri.Format("%d",p->pri);
		strTime.Format("%d",p->time);
		strStatus="就绪";

		pDC->TextOut(LEFT+10,y_rf+i*H,strID);
		pDC->TextOut(LEFT+W+10,y_rf+i*H,strPri);
		pDC->TextOut(LEFT+2*W+10,y_rf+i*H,strTime);
		pDC->TextOut(LEFT+3*W+10,y_rf+i*H,strStatus);
	}
	
	pDC->SetTextColor(finishColor);

	pos=m_finishList.GetHeadPosition();
	for(i=0;i<F_num;i++)
	{
		p=(PCB*)m_finishList.GetNext(pos);
		strID.Format("%d",p->pid);
		strPri.Format("%d",p->pri);
		strTime.Format("%d",p->time);
		strStatus="完成";

		pDC->TextOut(LEFT+5,y_rf+(i+R_num)*H,strID);
		pDC->TextOut(LEFT+W+5,y_rf+(i+R_num)*H,strPri);
		pDC->TextOut(LEFT+2*W+5,y_rf+(i+R_num)*H,strTime);
		pDC->TextOut(LEFT+3*W+5,y_rf+(i+R_num)*H,strStatus);
	}
			
	pDC->SetTextColor(oldColor);

}
bool CProMoni::OpenLogFile()
{//打开日志文件
	 if(m_LogFile.Open( m_LogFileName,CFile::modeCreate|CFile::modeWrite ) )
	 {
		 CString str;
		 str.Format(" 时钟序列    运行进程           就绪进程\n");
		 m_LogFile.WriteString(str);
		 return true;
	 }
	 AfxMessageBox("文件打开失败!");
	 return false;
}
void CProMoni::CloseLogFile()
{
	m_LogFile.Close();
}

bool CProMoni::WriteLogToFile()
{	//写日志		
	CString str,strTemp1,strTemp2;
	str.Format("     %-3d  ",m_clock);//时钟序列
	if(m_pRunning)	//当前运行进程
	{
		strTemp1.Format("  %2d<%2d>(%2d)         ",m_pRunning->pid,m_pRunning->pri,m_pRunning->time);
		str+=strTemp1;
	}
	else
	{	
		strTemp1="                     ";
		str+=strTemp1;
	}
	//所有就绪进程
	POSITION pos;
	PCB *p;
	pos=m_readyList.GetHeadPosition();
	strTemp1.Empty();
	while(pos!=NULL)
	{
		strTemp2.Empty();
		p=(PCB*)m_readyList.GetNext(pos);
		strTemp2.Format("%d<%d>(%d),",p->pid,p->pri,p->time);
		strTemp1+=strTemp2;
	}
	strTemp1+="\n";
	str+=strTemp1;
	m_LogFile.WriteString(str);
	return true;
}

void CProMoni::RecordAllInfo()
{
	POSITION pos;
	PCB *p;
	RecordInfo* r,*pre,*head;

	r=new RecordInfo;
	if( m_pRunning != NULL)
	{
		r->pid=m_pRunning->pid;
		r->pri=m_pRunning->pri;
		r->time=m_pRunning->time;
		r->next=NULL;
		m_RunInfoList.AddTail(r);
	}
	else
	{//表示当前没有程序在运行
		r->pid=0;
		r->pri=0;
		r->time=0;
		r->next=NULL;
		m_RunInfoList.AddTail(r);
	}
	//记录就绪队列元素
	pos=m_readyList.GetHeadPosition();
	pre=new RecordInfo;
	pre->next=NULL;
	head=pre;
	while(pos!=NULL)
	{
		p=(PCB*)m_readyList.GetNext(pos);
		if(p!=NULL)
		{
			r=new RecordInfo;
			r->pid=p->pid;
			r->pri=p->pri;
			r->time=p->time;
			r->next=NULL;

			pre->next=r;
			pre=r;
		}
	}
	m_ReadyInfoList.AddTail(head);

	//记录完成队列元素
	pos=m_finishList.GetHeadPosition();
	pre=new RecordInfo;
	pre->next=NULL;
	head=pre;

	while(pos!=NULL)
	{
		p=(PCB*)m_finishList.GetNext(pos);
		r=new RecordInfo;
		r->pid=p->pid;
		r->pri=p->pri;
		r->time=p->time;
		r->next=NULL;

		pre->next=r;
		pre=r;
	}
	m_FinishInfoList.AddTail(head);
}

void CProMoni::DisplayRecordInfo(CDC *pDC)
{
	int x1=380;//时钟
	int x2=x1+50;//运行
	int x3=x2+80;//就绪
	int x4=x3+250;//完成

	int top=20;
	int height=25;
	
	COLORREF oldColor,titleColor,runColor,readyColor,finishColor;
	titleColor=RGB(10,50,150);
	runColor=RGB(255,0,0);
	readyColor=RGB(150,50,50);
	finishColor=RGB(155,100,0);;

	oldColor=pDC->SetTextColor(titleColor);

	pDC->TextOut(x1,top,"时钟");
	pDC->TextOut(x2,top,"运行");
	pDC->TextOut(x3,top,"就绪");
	pDC->TextOut(x4,top,"完成");


	RecordInfo* r,*run,*ready_head,*finish_head;
	POSITION run_pos,ready_pos,finish_pos;

	run_pos=m_RunInfoList.GetHeadPosition();
	ready_pos=m_ReadyInfoList.GetHeadPosition();
	finish_pos=m_FinishInfoList.GetHeadPosition();
	
	char ch[50];
	run= (RecordInfo*)m_RunInfoList.GetNext(run_pos);//表头元素
	for(int i=1;i<=m_clock;i++)
	{
		sprintf(ch,"%d",i);//时钟序列
		pDC->TextOut(x1,top+height*i,ch );

		//显示运行进程的信息
		if(run->pid!=0)
		{
			sprintf(ch,"%d<%d>(%d)",run->pid,run->pri,run->time);
			pDC->TextOut(x2,top+height*i,ch);
		}
		run=(RecordInfo*)m_RunInfoList.GetNext(run_pos);

		//显示就绪进程的信息
		ready_head= (RecordInfo*)m_ReadyInfoList.GetNext(ready_pos);

		r=ready_head->next;
		CString str,strtemp;
		while(r)
		{
			strtemp.Empty();
			strtemp.Format("%d<%d>(%d); ",r->pid,r->pri,r->time);
			str+=strtemp;
			r=r->next;
		}
		pDC->TextOut(x3,top+height*i,str);

		//显示完成进程的信息
		finish_head= (RecordInfo*)m_FinishInfoList.GetNext(finish_pos);

		r=finish_head->next;
		str.Empty();
		while(r)
		{
			strtemp.Empty();
			strtemp.Format("%d<%d>(%d); ",r->pid,r->pri,r->time);
			str+=strtemp;
			r=r->next;
		}
		pDC->TextOut(x4,top+height*i,str);
	}
		pDC->SetTextColor(oldColor);

}
/*void CProMoni::ClearAllRecord()
{	
//	 m_ReadyInfoList;
//	 m_RunInfoList;
//	 m_FinishInfoList;

	RecordInfo* r,*ready_head,*finish_head;
	POSITION ready_pos,finish_pos;

	m_RunInfoList.RemoreAll();
	ready_pos=m_ReadyInfoList.GetHeadPosition();
	finish_pos=m_FinishInfoList.GetHeadPosition();
	
	//显示就绪进程的信息
	ready_head= (RecordInfo*)m_ReadyInfoList.GetNext(ready_pos);

	r=ready_head->next;
	CString str,strtemp;
	while(r)
	{
		strtemp.Empty();
		strtemp.Format("%d<%d>(%d); ",r->pid,r->pri,r->time);
		str+=strtemp;
		r=r->next;
	}
	pDC->TextOut(x3,top+height*i,str);

	//显示完成进程的信息
	finish_head= (RecordInfo*)m_FinishInfoList.GetNext(finish_pos);

	r=finish_head->next;
	str.Empty();
	while(r)
	{
		strtemp.Empty();
		strtemp.Format("%d<%d>(%d); ",r->pid,r->pri,r->time);
		str+=strtemp;
		r=r->next;
	}

}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -