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

📄 processdlg.cpp

📁 一个学习操作系统原理很好的演示程序.演示进程调度与读写者的同步问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		b3.EnableWindow();
		SetTimer(1,curSpeed,NULL);
	}
	else
	{
		KillTimer(1);
		b1.SetWindowText("继续");
		b2.EnableWindow();
		IsRunning=false;
	}
}


void CProcessDlg::OnTimer(UINT nIDEvent) 
{
	if (eng->IsEnded()) 
	{
		KillTimer(1);
		IsRunning=false;
		b1.SetWindowText("开始");
		b1.EnableWindow(FALSE);
		b2.EnableWindow();
		return;
	}
	eng->StepTo(count++);
	if (eng->HasMessage())
	{
		int n;
		CString * s=eng->getMessage(&n);
		for (int i=0;i<n;i++) list.AddString(s[i]);
	}
	startTime=count-1-timeLong+10;
	if (startTime<0) startTime=0;
	m_scr1.SetScrollPos(startTime);
	Draw();
	CDialog::OnTimer(nIDEvent);
}

void CProcessDlg::DrawProgress(CDC * dc)
{
	tdc.BitBlt(0,0,80,HEIGHT,NULL,0,0,WHITENESS);
	tdc.Rectangle(0,0,60,timeLong*Text);
	CBrush  brush;
	brush.CreateSolidBrush(back);
	CBrush * old;
	old=tdc.SelectObject(&brush);
	if (count-startTime-1>=0) tdc.Rectangle(0,0,60,(count-1-startTime)*Text);
	tdc.SelectObject(old);
	for (int i=1;i<timeLong;i++)
	{
		tdc.MoveTo(0,i*Text);
		tdc.LineTo(60,i*Text);
	}
	tdc.MoveTo(25,0);
	tdc.LineTo(25,timeLong*Text);
	CString s;
	CFont * oldFont;
	oldFont=tdc.SelectObject(&progressFont);
	for (i=0;i<timeLong;i++)
	{
		if (i+startTime<0) continue;
		if (i+startTime>=total) break;
		s.Format("%d",i+startTime);
		if (i<count-1-startTime)
			tdc.SetBkColor(back);
		else tdc.SetBkColor(RGB(255,255,255));
		tdc.TextOut(25+3,i*Text+1,s);
		s.Format("%d",run[i+startTime]);
		if (run[i+startTime]!=0) tdc.TextOut(3,i*Text+1,s);
		
	}
	tdc.SetBkColor(RGB(255,255,255));
	tdc.SelectObject(oldFont);
	dc->BitBlt(400,HEIGHT-timeLong*Text,60,timeLong*Text,&tdc,0,0,SRCCOPY);
}

void CProcessDlg::DrawInformation(CDC *dc)
{
	tdc.BitBlt(0,0,65*4,160,NULL,0,0,WHITENESS);
	tdc.Rectangle(0,0,65*4,160);
	for (int i=1;i<8;i++)
	{
		tdc.MoveTo(0,i*20);
		tdc.LineTo(65*4,i*20);
	}
	for (i=1;i<4;i++)
	{
		tdc.MoveTo(i*65,0);
		tdc.LineTo(i*65,160);
	}
	CFont * oldFont;
	oldFont=tdc.SelectObject(&inforFont);
	tdc.TextOut(4,2,"名称");
	if (engineType==PRIORITY) tdc.TextOut(65+4,2,"优先级");
	else tdc.TextOut(65+4,2,"轮转片");
	tdc.TextOut(65*2+4,2,"开始时间");
	tdc.TextOut(65*3+4,2,"运行时长");
	CString s;
	PPCB a=eng->getA();
	for (i=1;i<=7;i++)
	{
		if (i-1+startNum<0) continue;
		if (i-1+startNum>=num) break;
		tdc.TextOut(4,i*20+2,a[i-1+startNum].name);
		if (engineType==PRIORITY) s.Format("  %d",a[i-1+startNum].priority);
		else s.Format("  %d",a[i-1+startNum].round);
		tdc.TextOut(65+4,i*20+2,s);
		s.Format("  %d",a[i-1+startNum].timeStart);
		tdc.TextOut(65*2+4,i*20+2,s);
		s.Format("  %d",a[i-1+startNum].timeLeft);
		tdc.TextOut(65*3+4,i*20+2,s);
	}
	tdc.SelectObject(oldFont);
	dc->BitBlt(480,0,65*4,160,&tdc,0,0,SRCCOPY);
}


void CProcessDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::OnLButtonDown(nFlags, point);
	int h=35;
	int y0=HEIGHT-40;
	int y=y0;
	if (point.x>=10&&point.x<=80)
	{
		int n=(y0-point.y)/h;
		if (n<0) return;
		PPCB newHead=eng->getNewHead();
		int i=0;
		while(newHead!=NULL)
		{
			if (i==n){
				curSel=newHead;
				this->UpdateData(FALSE);
				Draw();
			}
			i++;
			newHead=newHead->next;
		}
		return;
	}
	if (point.x>=110&&point.x<=180)
	{
		int n=(y0-point.y)/h;
		if (n<0) return;
		PPCB readyHead=eng->getReadyHead();
		int i=0;
		while(readyHead!=NULL)
		{
			if (i==n){
				curSel=readyHead;
				this->UpdateData(FALSE);
				Draw();
			}
			i++;
			readyHead=readyHead->next;
		}
		return;
	}
	if (point.x>=210&&point.x<=280)
	{
		int n=(y0-point.y)/h;
		if (n!=0) return;
		PPCB running=eng->getRunning();
		curSel=running;
		this->UpdateData(FALSE);
		Draw();
		return;
	}
	if (point.x>=310&&point.x<=380)
	{
		int n=(y0-point.y)/h;
		if (n<0) return;
		PPCB endedHead=eng->getEndedHead();
		int i=0;
		while(endedHead!=NULL)
		{
			if (i==n){
				curSel=endedHead;
				this->UpdateData(FALSE);
				Draw();
			}
			i++;
			endedHead=endedHead->next;
		}
		return;
	}
}

void CProcessDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int min,max;
	int nCurPos=pScrollBar->GetScrollPos();
	pScrollBar->GetScrollRange(&min,&max);
	CClientDC dc(this);
	if (max==num-7)
	{
		switch(nSBCode)
		{
		case SB_LINEDOWN:
			nCurPos++;break;
		case SB_LINEUP:
			nCurPos--;break;
		case SB_PAGEDOWN:
			nCurPos+=max/8;break;
		case SB_PAGEUP:
			nCurPos-=max/8;break;
		case SB_THUMBTRACK:
			nCurPos=nPos;
			break;
		}
		startNum=nCurPos;
		DrawInformation(&dc);
	}
	else
	{
		switch(nSBCode)
		{
		case SB_LINEDOWN:
			nCurPos++;break;
		case SB_LINEUP:
			nCurPos--;break;
		case SB_PAGEDOWN:
			nCurPos+=max/10;break;
		case SB_PAGEUP:
			nCurPos-=max/10;break;
		case SB_THUMBTRACK:
			nCurPos=nPos;
			break;
		}
		startTime=nCurPos;
		DrawProgress(&dc);
	}
	pScrollBar->SetScrollPos(nCurPos);
	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CProcessDlg::Init()
{
	memset(run,0,sizeof(int)*5000);
	UpdateData();
	eng->CreateProcesses(num,maxPriority,maxTimeStart,maxTimeExe);
	eng->CopyProcesses();
	eng->InitQueue();
	count=0;
	while (!eng->IsEnded())
	{
		eng->StepTo(count);
		if (eng->getRunning()!=NULL)
			run[count]=eng->getRunning()->ID;
		count++;
	}
	total=count-1;
	WorkOutAvr();
	count=0;
	eng->CopyProcesses();
	eng->InitQueue();
	curSel=eng->getB();
	m_scr2.SetScrollRange(0,num-7);
	m_scr2.SetScrollPos(num-7);
	startNum=num-7;
	startTime=0;
	m_scr1.SetScrollRange(0,total-timeLong/2);

}

void CProcessDlg::OnButton2() 
{
	Init();
	b1.EnableWindow();
	list.ResetContent();
	Draw();
}

void CProcessDlg::OnButton3() 
{
	KillTimer(1);
	list.ResetContent();
	b3.EnableWindow(FALSE);
	if (curSpeed!=-1) b1.SetWindowText("开始");
	b1.EnableWindow();
	b2.EnableWindow();
	IsRunning=false;	
	count=0;
	eng->CopyProcesses();
	eng->InitQueue();
	curSel=eng->getB();
	m_scr2.SetScrollRange(0,num-7);
	m_scr2.SetScrollPos(num-7);
	startNum=num-7;
	startTime=0;
	m_scr1.SetScrollRange(0,total-timeLong/2);
	Draw();
}

void CProcessDlg::OnSelchangeCombo1() 
{
	int i=com.GetCurSel();
	bool isrun;
	switch(i)
	{
	case 0:
		if (engineType==PRIORITY) return;
		isrun=IsRunning;
		engineType=PRIORITY;
		KillTimer(1);
		eng=eng1;
		list.ResetContent();
		b3.EnableWindow(FALSE);
		b1.SetWindowText("开始");
		b1.EnableWindow();
		b2.EnableWindow();
		IsRunning=false;	
		count=0;
		eng->copyEngine(eng2);
		eng->CopyProcesses();
		eng->InitQueue();
		count=0;
		while (!eng->IsEnded())
		{
			eng->StepTo(count);
			if (eng->getRunning()!=NULL)
			run[count]=eng->getRunning()->ID;
			count++;
		}
		total=count-1;
		WorkOutAvr();
		count=0;
		eng->CopyProcesses();
		eng->InitQueue();

		curSel=eng->getB();
		m_scr2.SetScrollRange(0,num-7);
		m_scr2.SetScrollPos(num-7);
		startNum=num-7;
		startTime=0;
		m_scr1.SetScrollRange(0,total-timeLong/2);
		Draw();
		if (isrun) this->OnButton1();
		break;
	case 1:
		if (engineType==ROUND) return;
		isrun=IsRunning;
		engineType=ROUND;
		KillTimer(1);
		eng=eng2;
		list.ResetContent();
		b3.EnableWindow(FALSE);
		b1.SetWindowText("开始");
		b1.EnableWindow();
		b2.EnableWindow();
		IsRunning=false;	
		count=0;
		eng->copyEngine(eng1);
		eng->CopyProcesses();
		eng->InitQueue();
		count=0;
		while (!eng->IsEnded())
		{
			eng->StepTo(count);
			if (eng->getRunning()!=NULL)
			run[count]=eng->getRunning()->ID;
			count++;
		}
		total=count-1;
		WorkOutAvr();
		count=0;
		eng->CopyProcesses();
		eng->InitQueue();
		curSel=eng->getB();
		m_scr2.SetScrollRange(0,num-7);
		m_scr2.SetScrollPos(num-7);
		startNum=num-7;
		startTime=0;
		m_scr1.SetScrollRange(0,total-timeLong/2);
		Draw();
		if (isrun) this->OnButton1();
		break;
	}
}

void CProcessDlg::OnSelchangeCombo2() 
{
	int i=com2.GetCurSel();
	if (i==5) 
	{
		curSpeed=-1;
		b1.SetWindowText("下一步");
		if (IsRunning)
		{
			KillTimer(1);
		}
	}
	else
	{
		curSpeed=speed[i];
		if (IsRunning)
		{
			KillTimer(1);
			SetTimer(1,curSpeed,NULL);
			b1.SetWindowText("暂停");
		}
	}
}

void CProcessDlg::WorkOutAvr()
{
	int n=eng->getNum();
	int sum=0;
	PPCB b=eng->getB();
	for (int i=0;i<n;i++)
		sum+=(b[i].timeEnded-b[i].timeStart);
	avr=sum/n;
}

⌨️ 快捷键说明

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