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

📄 jinchengdiaodudlg.cpp

📁 操作系统里面的进程调度
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						tempQueue[0]->EnQueue(tempPrograme[CountPro-1]);  //放入队列末尾
						//抢占正在运行进程的CPU ????????????????????
                           RobCPU(RecordServiceNu);
                           //直接运行该进程
						   if(!tempQueue[0]->isEmpty())
						   SetTimerAndRunPrograme(tempQueue[0]);
						 //SetTimer(tempQueue[0]->DeQueue()->ProNumber,50,NULL);   //在Timer函数中调用运行进程的函数
					}
					/**************************************/
					else    //如果该进程就绪队列的优先级不高于正在运行进程的就绪队列的优先级
					{
						    //放入队列的末尾
						 tempQueue[0]->EnQueue(tempPrograme[CountPro-1]);  //放入队列末尾
					}
					/*************************************************/
		   }
		  //tempQueue[0]->EnQueue(&programeItem);
		   /***********************测试数据****************************
	         UpdateData(TRUE);
			m_item=tempPrograme[CountPro-1]->GetServiceTime();
            UpdateData(FALSE);
	    	/******************************************************/
          // RobCPU(CountPro-1);  
		   
	   }
	   else  //如果队列不为空,放入队列末尾
	   {
          tempQueue[0]->EnQueue(tempPrograme[CountPro-1]);  //放入队列末尾
	   }
	}
	else   //如果内存被占满了,则放入等待队列
	{
	  programe * waitPrograme;   
	  waitPrograme=new programe(sTime);
	  WaitProCount++;
      WaitForMemery(waitPrograme);   //放入等待队列
	}	
}

bool CJinChengDiaoduDlg::MemeryIsFull()  //判断内存是否已经被占满了
{
	if(CountPro>=20)
	{
    return true;
	}
	else 
	return false;
}

void CJinChengDiaoduDlg::WaitForMemery(programe* item)  //等待分配内存
{
       waitQueue.EnQueue(item);
}

bool CJinChengDiaoduDlg::FirstQueueIsEmpty()   //判断第一个就绪队列是否为空
{
	return false;//tempQueue[0]->isEmpty();
}

void CJinChengDiaoduDlg::RobCPU(int item)
{/////////////////////////////////////////////////////////////////////
	
	///////////////////////////////////
	WaitForCPU(item );

	//将其调入下一就绪队列
	int RSQNumber;
    RSQNumber=tempPrograme[item]->QueuNumber;
    tempQueue[RSQNumber+1]->EnQueue(tempPrograme[item]);  //转入下一个队列
	 /***********************测试数据****************************
	         UpdateData(TRUE);
			m_item=tempPrograme[item]->GetServiceTime();
            UpdateData(FALSE);
	    	/******************************************************/
}

void CJinChengDiaoduDlg::WaitForCPU(int ProNumber )
{
            KillTimer(ProNumber); //结束CPU给它的服务
			RecordServiceNu=-2;
}

void CJinChengDiaoduDlg::RunPrograme(int item)
{
        
	RecordServiceNu=item;
   /****************************测试数据*********************
				 UpdateData(TRUE);
				 m_item=tempPrograme[item]->GetServiceTime();
                 UpdateData(FALSE);
				 /****************************测试数据*********************/
        if(tempPrograme[item]->GetSJPian()>0)   //如果时间片没有用完
		{
		     tempPrograme[item]->Updata(-1);     //将分配给它的时间片减1
	         if(tempPrograme[item]->GetServiceTime() >0)  //如果剩下的服务时间大于0
			 {
               p_MyProgressCtrl[item]->StepIt();
               tempPrograme[item]->SetServiceTime(-1);         //将剩下的服务时间减1
		       //return 0;
			 }
		     else  //如果进程已经执行完毕
			 {   
				 WaitForCPU(RecordServiceNu);
				 int RSQNumber;      
				 RSQNumber=tempPrograme[item]->QueuNumber;   //寄存该队列的队列号
				 
				//tempQueue[tempPrograme[item]->QueuNumber]->DeQueue();
			    /*	 delete []tempPrograme[item];
				 tempPrograme[item]=new programe;*/
				
				//delete p_MyProgressCtrl[item];
				 //p_MyProgressCtrl[item];
	            //delete b_MyButton[item];
	            //delete b_MyButtonQu[RSQNumber];
				//delete []
				//tempPrograme[item]=NULL;
              
		    /*	for(int i=item;i<CountPro-1;i++)    //将该进程的索引删除
				{
					tempPrograme[i+1]->ProNumber=i;
                 tempPrograme[i]=tempPrograme[i+1];
                 //tempPrograme[i]->ProNumber=i;
				}
                tempPrograme[i+1]=NULL;*/
				
				//撤销该进程
                CountPro--;    //就绪队列中的进程数减1
                if(!waitQueue.isEmpty())    //如果等待队列不为空
				{
					WaitProCount--;
					tempPrograme[++CountPro]=waitQueue.DeQueue();//就绪队列中的进程数加1
                    tempPrograme[CountPro]->ProNumber=CountPro;
                    tempQueue[0]->EnQueue(tempPrograme[CountPro]);  //将等待队列中的首部进程调入就绪队列
			       	//CountPro++;  
				}
			/***************************************************	
			**********************************************************/

					 //遍历所有队列(设为k队列)
					 //1:不为空则运行k队列的首进程,中断遍历
					 //2:为空则继续往下一队列遍历,直到遍历到的最后一个队列依然为空,则CPU置闲
                     for(int k=0;k<10;k++)
					  {
                           if(!tempQueue[k]->isEmpty())
						   {
							   break;	  
						   }
						   
					  }
					  if(k!=10)
					  {
                          //运行该队列的首进程
							   SetTimerAndRunPrograme(tempQueue[k]);
                               //SetTimer(tempQueue[k]->DeQueue()->ProNumber,50,NULL);
					  }
					  else
					  {
						  //CPU置闲?????????????
						   RecordServiceNu=-2;
						   MessageBox("所有进程运行完毕!","提示",1);
					  }
			 }
		}
		else    //如果时间片用完了
		{   
			WaitForCPU(item);
			int RSQNumber;
            RSQNumber=tempPrograme[item]->QueuNumber;   //寄存该队列的队列号
			//delete b_MyButtonQu[RSQNumber];
			if(RSQNumber==9)  //如果该进程是在最后一个队列,则将该进程放入第一个队列
			{
				//将该进程放入第一个队列
                tempQueue[0]->EnQueue(tempPrograme[item]);  //放入队列末尾
                 
				//运行第一个队列的首进程
				SetTimerAndRunPrograme(tempQueue[0]);
                //SetTimer(tempQueue[0]->DeQueue()->ProNumber,50,NULL);
			}
			else   //如果该进程不是在最后一个队列
			{
				//将该进程放入下一个队列的末尾
               tempQueue[RSQNumber+1]->EnQueue(tempPrograme[item]);  //放入队列末尾 
			   if(!tempQueue[RSQNumber]->isEmpty()) //如果本就绪队列不为空,则运行该队列的首进程
				 {
				      SetTimerAndRunPrograme(tempQueue[RSQNumber]); 
                      //SetTimer(tempQueue[RSQNumber]->DeQueue()->ProNumber,50,NULL);
				 }
               else   //如果本就绪队列为空
				{
                        //则运行下一队列的首进程
				   if(!tempQueue[RSQNumber+1]->isEmpty())
				   {
				      SetTimerAndRunPrograme(tempQueue[RSQNumber+1]); 
				   }
                    
			   }
			}
		}

}

bool CJinChengDiaoduDlg::ProgrameIsFinished()
{
       return true;
}

void CJinChengDiaoduDlg::programeGetOut()
{
      
}



CJinChengDiaoduDlg::~CJinChengDiaoduDlg()
{    int m;
	
	for(m=0;m<100;m++)
	{
		delete p_MyProgressCtrl[m];
		delete b_MyButton[m];
	}
	for( m=0;m<CountPro;m++)
	{
		delete []tempPrograme[m];
	}
	for(m=0;m<10;m++)
	{
		delete []b_MyButtonQu[m];
	}
	delete []p_MyProgressCtrl;
	delete []b_MyButton;
	delete []b_MyButtonQu;
   delete []tempPrograme;
}

CProgressCtrl* CJinChengDiaoduDlg::NewMyProgressCtrl(DWORD dwStyle, const RECT& rect, CWnd * pParentWnd,UINT nID )
{
	/**********************************************/

   CProgressCtrl *p_ProgressCtrl = new CProgressCtrl();
  p_ProgressCtrl->Create( dwStyle, rect, pParentWnd, nID ); //创建按钮
   return p_ProgressCtrl;
}

void CJinChengDiaoduDlg::setProgress(int item)
{
         //int x;
		 int y;
		 //x=tempPrograme[item]->ProNumber;
		 y=tempPrograme[item]->QueuNumber;
	     p_MyProgressCtrl[item] = NewMyProgressCtrl(WS_VISIBLE|PBS_SMOOTH,CRect(135,50+20*item,645,70+20*item),this,IDS_MYPROGRESS1);
         
	    p_MyProgressCtrl[item]->SetRange(0,10000);
 	    p_MyProgressCtrl[item]->SetStep(10000/(tempPrograme[item]->GetServiceTime()));
	    CString str;
	    str.Format("%d",item);
	    b_MyButton[item]=NewMyButton(str,ID_MYBUT1, CRect(10,50+20*item,50,70+20*item), 0 );
}

void CJinChengDiaoduDlg::SetTimerAndRunPrograme(Queue *  itemQueue)
{
	/******************************************************/
      int s;
	  int y;
	  s=(itemQueue->DeQueue())->ProNumber;
	  y=tempPrograme[s]->QueuNumber;
	  CString str;
	  str.Format("%d",y+1);
	  b_MyButtonQu[y]=NewMyButton(str,ID_MYBUT1, CRect(70,50+20*s,110,70+20*s), 0 );
	   /********************************************************************/
	  if(!tempPrograme[s]->IsHaveSevieced)
	  {
       tempPrograme[s]->IsHaveSevieced=true;
	    setProgress(s);
	  }
	  SetTimer(s,1,NULL);
}
CButton* CJinChengDiaoduDlg::NewMyButton(CString ProOrQuNumber,int nID, CRect rect, int nStyle)
{
    CButton *p_Button = new CButton();
    ASSERT_VALID(p_Button);
    p_Button->Create( ProOrQuNumber, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); //创建按钮
    return p_Button;
}

void CJinChengDiaoduDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	SetTimer(-1,100,NULL);
}

void CJinChengDiaoduDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	KillTimer(-1);
}

⌨️ 快捷键说明

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