📄 promoni.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 + -