📄 processdlg.cpp
字号:
fin>>temp;
if((atoi(temp) == 9)||(atoi(temp) == 22))
break;
m_PCB->processName = temp; //读进程名字
fin>>temp;
m_PCB->processID = atoi(temp); //读进程标识符
fin>>temp;
m_PCB->state = temp; //读进程状态
fin>>temp;
m_PCB->priority = atoi(temp); //读进程优先权
fin>>temp;
m_PCB->kind = temp; //读进程类别
fin>>temp;
m_PCB->needTime = atoi(temp); //读进程运行所需时间
m_PCB->occupySize = rand()%5 + 3;
if(!LookForPartition(m_PCB))
{
CString s = "进程";
CString str;
str.Format("%d",m_PCB->processID);
s += str;
s += "没有合适的分区,创建失败!";
AfxMessageBox(s);
return;
} //为创建的进程寻找分区
m_PCB->next = NULL;
if(m_PCB->priority != 0) //将实时进程插入实时进程链表
{
RealTime_Insert(m_PCB);
}
else
{
Ordinary_Insert(m_PCB); //将普通进程插入普通进程队列
}
n++;
}
}
//将实时进程按优先权高低插入实时进程链表
void CPROCESSDlg::RealTime_Insert(struct PCB *item)
{
if(RealTime_ReadyList->next == NULL)//若实时链表是空的,则直接插入
{
item->next = RealTime_ReadyList->next;
this->RealTime_ReadyList->next = item;
}
else
{
struct PCB * p,* q;
p = RealTime_ReadyList->next;
q = p;
while((p != NULL)&&(p->priority > item->priority))//比较优先权
{
q = p;
p = p->next;
}
item->next = q->next; //插入
q->next = item;
}
}
void CPROCESSDlg::ShowRealTime()
{
struct PCB * p = RealTime_ReadyList->next;
int k = 0;
m_ListCtrl_Process.DeleteAllItems();
while(p != NULL)
{
CString m_str ;
m_str = p->processName;
m_ListCtrl_Process.InsertItem(k,m_str,0); //插入进程名字
m_str.Format("%d",p->processID);
m_ListCtrl_Process.SetItemText(k,1,m_str); //插入进程标识符
m_str = p->state;
m_ListCtrl_Process.SetItemText(k,2,m_str); //插入进程状态
m_str.Format("%d",p->priority);
m_ListCtrl_Process.SetItemText(k,3,m_str); //插入进程优先权值
m_str = p->kind;
m_ListCtrl_Process.SetItemText(k,4,m_str); //插入进程种类
m_str.Format("%d",p->needTime);
m_ListCtrl_Process.SetItemText(k,5,m_str); //插入进程所需时间
m_str.Format("%d",p->StartAddress);
m_ListCtrl_Process.SetItemText(k,6,m_str); //插入进程所需时间
k++;
p = p->next;
}
}
void CPROCESSDlg::ShowOrdinary()
{
struct PCB * p = Ordiary_ReadyList->next;
int k = 0;
m_ListCtrl_Ordinary.DeleteAllItems();
while(p != NULL)
{
CString m_str ;
m_str = p->processName;
m_ListCtrl_Ordinary.InsertItem(k,m_str,0); //插入进程名字
m_str.Format("%d",p->processID);
m_ListCtrl_Ordinary.SetItemText(k,1,m_str); //插入进程标识符
m_str = p->state;
m_ListCtrl_Ordinary.SetItemText(k,2,m_str); //插入进程状态
m_str.Format("%d",p->priority);
m_ListCtrl_Ordinary.SetItemText(k,3,m_str); //插入进程优先权值
m_str = p->kind;
m_ListCtrl_Ordinary.SetItemText(k,4,m_str); //插入进程种类
m_str.Format("%d",p->needTime);
m_ListCtrl_Ordinary.SetItemText(k,5,m_str); //插入进程所需时间
m_str.Format("%d",p->StartAddress);
m_ListCtrl_Ordinary.SetItemText(k,6,m_str); //插入进程所需时间
k++;
p = p->next;
}
}
void CPROCESSDlg::ExecutingProcess()
{
m_TimePieceRun.SetPos(0);
m_ProcessRun.SetPos(0);
if(RealTime_ReadyList->next != NULL) //若存在实时进程,则先执行实时进程
{
m_isRunning = true;
m_PCBRunning = RealTime_ReadyList->next; //从实时进程队列中调度实时进程
RealTime_ReadyList->next = m_PCBRunning->next;
}
else //否则执行普通进程(批处理和分时进程)
{
m_isRunning = true;
m_PCBRunning = Ordiary_ReadyList->next; //从普通进程队列中调度进程
Ordiary_ReadyList->next = m_PCBRunning->next;
}
m_PCBRunning->state = "RUNNING"; //将进程的状态由"就绪态"改为"运行态"
SetTimer(1,500,NULL);
}
void CPROCESSDlg::InitialListCtrl()
{
//设置CListCtrl实时进程(ready)的标题
m_ListCtrl_Process.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ListCtrl_Process.InsertColumn(0,_T("ProcessName"),LVCFMT_IMAGE|LVCFMT_LEFT);
m_ListCtrl_Process.InsertColumn(1,_T("ProcessID"));
m_ListCtrl_Process.InsertColumn(2,_T("State"));
m_ListCtrl_Process.InsertColumn(3,_T("Priority"));
m_ListCtrl_Process.InsertColumn(4,_T("Kind"));
m_ListCtrl_Process.InsertColumn(5,_T("NeedTime"));
m_ListCtrl_Process.InsertColumn(6,_T("startAddr"));
int j;
m_ListCtrl_Process.SetColumnWidth(0 ,100);
m_ListCtrl_Process.SetColumnWidth(1 ,100);
for(j=2;j<7;j++)
{
m_ListCtrl_Process.SetColumnWidth(j ,90);
}
m_ListCtrl_Process.SetBkColor(RGB(200,247,243));
m_ListCtrl_Process.SetTextBkColor( RGB(200,247,243) );
//设置CListCtrl普通进程(批处理和分时进程)(ready)的标题
m_ListCtrl_Ordinary.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ListCtrl_Ordinary.InsertColumn(0,_T("ProcessName"),LVCFMT_IMAGE|LVCFMT_LEFT);
m_ListCtrl_Ordinary.InsertColumn(1,_T("ProcessID"));
m_ListCtrl_Ordinary.InsertColumn(2,_T("State"));
m_ListCtrl_Ordinary.InsertColumn(3,_T("Priority"));
m_ListCtrl_Ordinary.InsertColumn(4,_T("Kind"));
m_ListCtrl_Ordinary.InsertColumn(5,_T("NeedTime"));
m_ListCtrl_Ordinary.InsertColumn(6,_T("startAddr"));
m_ListCtrl_Ordinary.SetColumnWidth(0 ,100);
m_ListCtrl_Ordinary.SetColumnWidth(1 ,100);
for(j=2;j<7;j++)
{
m_ListCtrl_Ordinary.SetColumnWidth(j ,90);
}
m_ListCtrl_Ordinary.SetBkColor(RGB(200,247,243));
m_ListCtrl_Ordinary.SetTextBkColor( RGB(200,247,243) );
//设置CListCtrl阻塞进程的标题
m_ListCtrl_Blocked.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ListCtrl_Blocked.InsertColumn(0,_T("ProcessName"),LVCFMT_IMAGE|LVCFMT_LEFT);
m_ListCtrl_Blocked.InsertColumn(1,_T("ProcessID"));
m_ListCtrl_Blocked.InsertColumn(2,_T("State"));
m_ListCtrl_Blocked.InsertColumn(3,_T("Priority"));
m_ListCtrl_Blocked.InsertColumn(4,_T("Kind"));
m_ListCtrl_Blocked.InsertColumn(5,_T("NeedTime"));
m_ListCtrl_Blocked.InsertColumn(6,_T("startAddr"));
m_ListCtrl_Blocked.InsertColumn(7,_T("BlockedReason"));
m_ListCtrl_Blocked.SetColumnWidth(0 ,100);
m_ListCtrl_Blocked.SetColumnWidth(1 ,100);
m_ListCtrl_Blocked.SetColumnWidth(2 ,80);
for(j=3;j<7;j++)
{
m_ListCtrl_Blocked.SetColumnWidth(j ,90);
}
m_ListCtrl_Blocked.SetColumnWidth(7 ,120);
m_ListCtrl_Blocked.SetBkColor(RGB(200,247,243));
m_ListCtrl_Blocked.SetTextBkColor( RGB(200,247,243) );
//设置CListCtrl正在运行进程的标题
m_ListCtrl_Running.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ListCtrl_Running.InsertColumn(0,_T("ProcessName"),LVCFMT_IMAGE|LVCFMT_LEFT);
m_ListCtrl_Running.InsertColumn(1,_T("ProcessID"));
m_ListCtrl_Running.InsertColumn(2,_T("State"));
m_ListCtrl_Running.InsertColumn(3,_T("Priority"));
m_ListCtrl_Running.InsertColumn(4,_T("Kind"));
m_ListCtrl_Running.InsertColumn(5,_T("NeedTime"));
m_ListCtrl_Running.InsertColumn(6,_T("startAddr"));
m_ListCtrl_Running.SetColumnWidth(0 ,100);
m_ListCtrl_Running.SetColumnWidth(1 ,100);
for(j=2;j<6;j++)
{
m_ListCtrl_Running.SetColumnWidth(j ,80);
}
m_ListCtrl_Running.SetColumnWidth(6 ,90);
m_ListCtrl_Running.SetBkColor(RGB(200,247,243));
m_ListCtrl_Running.SetTextBkColor( RGB(200,247,243) );
}
void CPROCESSDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
ShowRunning();
ShowRealTime();
ShowOrdinary();
ShowBlocked();
if(m_isClick)
{
dlg.M = M;
dlg.Show();
}
if(nIDEvent == 1)
{
m_TimePieceRun.StepIt();//滑块的移动
m_ProcessRun.SetStep((float)100/m_PCBRunning->needTime);
m_ProcessRun.StepIt();
remainTime = m_PCBRunning->needTime - (int)((float)m_ProcessRun.GetPos()/(float)200 * m_PCBRunning->needTime);
if((m_PCBRunning->priority == 0)&&(m_PCBRunning->needTime > timePeriod))
if((m_TimePieceRun.GetPos() >= 200)&&(Ordiary_ReadyList->next != NULL))
{
m_PCBRunning->needTime -= timePeriod;//注意:最后一个进程则不受时间片的限制
m_PCBRunning->state = "READY";//并回到就绪队列,再重新进行进程调度
Ordinary_Insert(m_PCBRunning);
KillTimer(1);
ExecutingProcess();
}
if((m_ProcessRun.GetPos() >= 190))//一个进程执行完毕之后开始重新进行进程的调度
{
KillTimer(1);
this->Release(m_PCBRunning);
m_isRunning = false;
if((Ordiary_ReadyList->next != NULL)||(RealTime_ReadyList->next != NULL))
ExecutingProcess();
else
{
m_ListCtrl_Running.DeleteAllItems();//所有进程都已执行完毕
if(m_isClick)
{
dlg.M = M;
dlg.Show();
}
AfxMessageBox("The process running is over!");
m_TimePieceRun.SetPos(0);
m_ProcessRun.SetPos(0);
}
}
}
CDialog::OnTimer(nIDEvent);
}
void CPROCESSDlg::ShowRunning()
{
m_ListCtrl_Running.DeleteAllItems();
CString m_str ;
m_str = m_PCBRunning->processName;
m_ListCtrl_Running.InsertItem(0,m_str,0); //插入进程名字
m_str.Format("%d",m_PCBRunning->processID);
m_ListCtrl_Running.SetItemText(0,1,m_str); //插入进程标识符
m_str = m_PCBRunning->state;
m_ListCtrl_Running.SetItemText(0,2,m_str); //插入进程状态
m_str.Format("%d",m_PCBRunning->priority);
m_ListCtrl_Running.SetItemText(0,3,m_str); //插入进程优先权值
m_str = m_PCBRunning->kind;
m_ListCtrl_Running.SetItemText(0,4,m_str); //插入进程种类
m_str.Format("%d",m_PCBRunning->needTime);
m_ListCtrl_Running.SetItemText(0,5,m_str); //插入进程所需时间
m_str.Format("%d",m_PCBRunning->StartAddress);
m_ListCtrl_Running.SetItemText(0,6,m_str); //插入进程所需时间
}
void CPROCESSDlg::Ordinary_Insert(PCB *item)
{
if(Ordiary_ReadyList->next == NULL) //若链表为空,则插在第一个位置
{
item->next = Ordiary_ReadyList->next;
Ordiary_ReadyList->next = item;
}
else //否则插在最后一个位置
{
struct PCB * p;
p = Ordiary_ReadyList->next;
while(p->next != NULL)
p = p->next;
p->next = item;
item->next = NULL; //插入
}
}
BOOL CPROCESSDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rcClient;
CBrush m_brBkgnd;
m_brBkgnd.CreateSolidBrush(RGB(186,86,106));//设置对话框背景颜色
GetClientRect(&rcClient);
pDC->FillRect(&rcClient,&m_brBkgnd);
return TRUE;
return CDialog::OnEraseBkgnd(pDC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -