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

📄 transferview.cpp

📁 《操作系统原理》课程设计 课题名称:磁臂调度及扇区排队算法模拟 模拟了FCFS和SSTF两种调度
💻 CPP
字号:
// transferView.cpp : implementation of the CTransferView class
//

#include "stdafx.h"
#include "transfer.h"

#include "transferDoc.h"
#include "transferView.h"

#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTransferView

IMPLEMENT_DYNCREATE(CTransferView, CView)

BEGIN_MESSAGE_MAP(CTransferView, CView)
	//{{AFX_MSG_MAP(CTransferView)
	ON_COMMAND(abc, Onabc)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTransferView construction/destruction

CTransferView::CTransferView()
{
	// TODO: add construction code here

}

CTransferView::~CTransferView()
{
}

BOOL CTransferView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CTransferView drawing

void CTransferView::OnDraw(CDC* pDC)
{
	CTransferDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here


	CRect rc;
	GetClientRect(&rc);
pDC->MoveTo(0,rc.bottom-120);
pDC->LineTo(430,rc.bottom-120);

CPen penyellow;
penyellow.CreatePen(PS_SOLID,4,RGB(128,128,0)); //166,202,240
CPen*ppen;
ppen=pDC->SelectObject(&penyellow);
pDC->MoveTo(40,38);
pDC->LineTo(650,38);
pDC->TextOut(660,28,"磁道");
pDC->TextOut(80,10,"                                  下  方  演  示  的  是  磁  臂  调  度  的  SSTF");
pDC->TextOut(10,50,"随");
pDC->TextOut(10,80,"机");
pDC->TextOut(10,110,"生");
pDC->TextOut(10,140,"成");
pDC->TextOut(10,170,"的");
pDC->TextOut(10,200,"访");
pDC->TextOut(10,230,"盘");
pDC->TextOut(10,260,"请");
pDC->TextOut(10,290,"求");
pDC->TextOut(30,28,"0");
pDC->TextOut(110,28,"30");
pDC->TextOut(210,28,"60");
pDC->TextOut(290,28,"90");
pDC->TextOut(380,28,"120");
pDC->TextOut(470,28,"150");
pDC->TextOut(560,28,"180");
pDC->TextOut(40,rc.bottom-100,"右 侧 模 拟 的 是 扇 区 排 队 的 FCFS");
pDC->TextOut(40,rc.bottom-40,"采 用 FCFS 的 总 延 迟 时 间");






pDC->MoveTo(650,38);
pDC->LineTo(600,28);
pDC->MoveTo(650,38);
pDC->LineTo(600,48);
pDC->MoveTo(40,38);
pDC->LineTo(40,(rc.bottom-120));
pDC->MoveTo(40,rc.bottom-120);
pDC->LineTo(30,(rc.bottom-170));
pDC->MoveTo(40,rc.bottom-120);
pDC->LineTo(50,(rc.bottom-170));

    pDC->SelectObject(ppen);



for(int q=0;q<300;q++)
{   if((records[q]!=0)&&(records[q+1]!=0))
{     

CPen penblue;
penblue.CreatePen(PS_SOLID,4,RGB(0,0,255)); //166,202,240
CPen*ppenOl;
ppenOl=pDC->SelectObject(&penblue);

	   pDC->MoveTo(records[q],records_v[q]);
       pDC->LineTo(records[q+1],records_v[q+1]);
       pDC->SelectObject(ppenOl);
      
}
}

//画条
if(ax!=0)
{

CBrush b(BS_HATCHED,RGB(0,0,255));
CBrush *pbrOl;
pbrOl=pDC->SelectObject(&b);
pDC->Rectangle(659,50,669,((ax/4)+50));
pDC->TextOut(670,90,"磁");
pDC->TextOut(670,130,"头");
pDC->TextOut(670,170,"移");
pDC->TextOut(670,210,"动");
pDC->TextOut(670,250,"总");
pDC->TextOut(670,290,"距");

pDC->TextOut(660,53,"0");
pDC->TextOut(649,400,"480");

//pDC->TextOut(631,400,"距");



 //假设寻道速度为 300道/秒,  为了获得较好的演示效果,实际演示时间与此时间不符。
pDC->Rectangle(689,50,699,((ax/5)+50));
pDC->TextOut(700,90,"寻");
pDC->TextOut(700,130,"道");
pDC->TextOut(700,170,"总");
pDC->TextOut(700,210,"时");
pDC->TextOut(700,250,"间");
pDC->TextOut(700,290,"开");
pDC->TextOut(700,330,"销");
pDC->TextOut(688,53,"0s");
pDC->TextOut(689,400,"2s");

//平均服务时间=总时间开销/请求个数     , 为了获得较好的演示效果,演示时平均服务时间都为1秒
pDC->Rectangle(718,50,728,(cx*7-150));
pDC->TextOut(731,90,"平");
pDC->TextOut(731,130,"均");
pDC->TextOut(731,170,"服");
pDC->TextOut(731,210,"务");
pDC->TextOut(731,250,"时");
pDC->TextOut(731,290,"间");
pDC->TextOut(717,53,"0s");
pDC->TextOut(717,350,"0.05s");



pDC->SelectObject(pbrOl);




//画横条

if(ax!=0)
{

CBrush b;
b.CreateSolidBrush(RGB(0,255,0));
CBrush *pbrOl;
pbrOl=pDC->SelectObject(&b);
pDC->Rectangle(5,rc.bottom-70,n*200/2-50,rc.bottom-55);

pDC->SelectObject(pbrOl);
}

pDC->TextOut(7,rc.bottom-71,"0s");

pDC->TextOut(400,rc.bottom-71,"0.02s");


//画游标
if(first!=0)
{CRect rc;
	GetClientRect(&rc);

CPen penred;
penred.CreatePen(PS_SOLID,4,RGB(255,0,0)); //166,202,240
CPen*ppenO;
ppenO=pDC->SelectObject(&penred);


pDC->MoveTo(current,55);
pDC->LineTo((current-10),40);
pDC->MoveTo(current,55);
pDC->LineTo((current+10),40);
pDC->MoveTo(current,(rc.bottom-135));
pDC->LineTo((current-10),(rc.bottom-120));
pDC->MoveTo(current,(rc.bottom-135));
pDC->LineTo((current+10),(rc.bottom-120));

pDC->MoveTo(current,55);
pDC->LineTo(current,(current_v-12));
pDC->MoveTo(current,(current_v+12));
pDC->LineTo(current,(rc.bottom-135));


  pDC->SelectObject(ppenO);



}
//画圆
for(int p=0;p<300;p++)
  {


CPen pengreen;
pengreen.CreatePen(PS_SOLID,1,RGB(0,255,0));
CPen*ppenOld;
ppenOld=pDC->SelectObject(&pengreen);


CBrush br;
br.CreateSolidBrush(RGB(0,255,0));
CBrush *pbrOld;
pbrOld= pDC->SelectObject(&br);

	pDC->Ellipse((task_mirror[p]-6),(vertical_mirror[p]-6),(task_mirror[p]+6),(vertical_mirror[p]+6));
pDC->SelectObject(pbrOld);
pDC->SelectObject(ppenOld);

  }

 //画扇区
CBrush brushBlu;
   CBrush* pOldBrus;
  brushBlu.CreateSolidBrush(RGB(255, 240, 220));

   pOldBrus= pDC->SelectObject(&brushBlu);
	pDC->Ellipse(440,220,640,420);
pDC->TextOut(636,320,"0");
pDC->TextOut(540,413,"3");
pDC->TextOut(440,320,"6");
pDC->TextOut(540,220,"9");
pDC->TextOut(636,320,"1");






pDC->SelectObject(pOldBrus);


if(second==1)
{



CBrush brushB;
   CBrush* pOldB;
  brushB.CreateSolidBrush(RGB(255, 255, 0));

   pOldB = pDC->SelectObject(&brushB);
   






for(int bb=0;bb<300;bb++)
{if(arr[kksave][bb]!=0)
{
pDC->Pie(440,220,640,420,(540+100*cos(arr[kksave][bb]-6)),(320+100*sin(arr[kksave][bb]-6)),(540+100*cos(arr[kksave][bb]+6)),(320+100*sin(arr[kksave][bb]+6)));
}
}

pDC->SelectObject(pOldB);

CBrush brushBlue;
   CBrush* pOldBrush;
  brushBlue.CreateSolidBrush(RGB(222, 202, 240));

   pOldBrush = pDC->SelectObject(&brushBlue);
for(int ss=0;ss<served;ss++)
{
pDC->Pie(440,220,640,420,(540+100*cos(arr[kksave][ss]-6)),(320+100*sin(arr[kksave][ss]-6)),(540+100*cos(arr[kksave][ss]+6)),(320+100*sin(arr[kksave][ss]+6)));
}

pDC->SelectObject(pOldBrush);


pDC->MoveTo(540,320);
	pDC->LineTo(540+25*cos(current_angle+90),320+25*sin(current_angle+90));

pDC->MoveTo(540,320);
	pDC->LineTo(540+25*cos(current_angle-90),320+25*sin(current_angle-90));

pDC->MoveTo(540+25*cos(current_angle+90),320+25*sin(current_angle+90));
	pDC->LineTo(540+100*cos(current_angle),320+100*sin(current_angle));

pDC->MoveTo(540+25*cos(current_angle-90),320+25*sin(current_angle-90));
	pDC->LineTo(540+100*cos(current_angle),320+100*sin(current_angle));







CPen pengreen;
pengreen.CreatePen(PS_SOLID,1,RGB(0,255,0));
CPen*ppenOld;
ppenOld=pDC->SelectObject(&pengreen);


CBrush br         ;
br.CreateSolidBrush(RGB(0,255,0)  );                                                               ;
CBrush *pbrOld;
pbrOld= pDC->SelectObject(&br);



pDC->SelectObject(pbrOld);
pDC->SelectObject(ppenOld);


}


}

/////////////////////////////////////////////////////////////////////////////
// CTransferView printing

BOOL CTransferView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CTransferView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CTransferView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CTransferView diagnostics

#ifdef _DEBUG
void CTransferView::AssertValid() const
{
	CView::AssertValid();
}

void CTransferView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CTransferDoc* CTransferView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTransferDoc)));
	return (CTransferDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTransferView message handlers

void CTransferView::Onabc() 
{
	// TODO: Add your command handler code here
	 for(int a=0;a<300;a++)
     {task[a]=0;
      vertical[a]=0;
task_mirror[a]=0;
      vertical_mirror[a]=0;
	  records[a]=0;
	  records_v[a]=0;
     }
    cursor=0;
	pointer=0;
	sth=0;
	delay=0;
	length=0;
	second=1;
	once=0;
	h=0;
request_num=0;
flag=0;
randnumber2=0;
kksave=0;
	ax=0;
	transferstop=0;
	kko=0;
	num=1;
	ba=0;
	l=0;
    temp=0;
    position=80;
    temp2=500;
    vertical_current=50;
    current_v=0;
    last=80;
    last_v=50;
    first=0;
for(int aj=0;aj<300;aj++)
	{
	for(int ppp=0;ppp<300;ppp++)
	{
	
		arr[aj][ppp]=0;
arr2[aj][ppp]=0;
	
	}
}
    SetTimer(1,500,NULL);
}

void CTransferView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default


if(length==0)
{

 randnumber=(rand()%4);

 CRect rc;
 GetClientRect(&rc);
if(vertical_current<(rc.bottom-150))
{
for(int b=0;b<randnumber;b++)
{ task[cursor+b]=(rand()%570+50);
  vertical[cursor+b]=vertical_current; 
  //生成扇区请求
   randnumber2=rand()%6;

   for (int delphi=0;delphi<randnumber2;delphi++)
   {arr[cursor+b][delphi]=rand()%360;
   arr2[cursor+b][delphi]=arr[cursor+b][delphi];
   }



//OnDraw 出来的是原数组的副本
 task_mirror[cursor+b]=task[cursor+b];
  vertical_mirror[cursor+b]=vertical_current;
   cursor=(randnumber+cursor);
   vertical_current=vertical_current+10;       
 


}




}





for(int c=0;c<300;c++)
{if((task[c]!=0)&&(task[c]!=500))
 {temp=abs((position-task[c]));              

     if(temp2>temp)
         {temp2=temp;
          current=task[c];
          current_v=vertical[c];
         
          }
	 
  }
}

ax=(ax+abs(position-current));


 position=current;
for(int kk=0;kk<300;kk++)
{    if(task[kk]==current)
{       task[kk]=500;
        kksave=kk;
num++;
        ba++;
}
}

cx=(ax/num);

if(current!=temptemp)
{
records[l]=current;
records_v[l]=current_v;
l++;
temptemp=current;
}

temp2=600;
first=first+1;
h=0;

   



}

for(int jboss=0;jboss<300;jboss++)
{  if((task[jboss]!=500) ||( task[jboss]!=0))
{sth=1;
}
}

if((arr[kksave][0]!=0)&&(sth=1))
{  
   if(once==0)
   { for(int pppoe=0;pppoe<300;pppoe++)
   {  if(arr[kksave][pppoe]!=0)
   {length++;
    once=1;
   }
   }
 n=length;
   }
  
  length--; 
if(arr2[kksave][pointer]!=333)
{current_angle=arr[kksave][pointer];
served=n-length;
   arr2[kksave][pointer]=333;                  
}
   pointer++;



  if(length==0)
  {once=0;
  pointer=0;
  }
  sth=0;
}  
   



Invalidate();


	CView::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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