📄 processdlg.cpp
字号:
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 + -