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

📄 processdlg.cpp

📁 一个比较详细的操作系统进程同步模拟的例子
💻 CPP
📖 第 1 页 / 共 3 页
字号:

		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 + -