📄 schedul_mfcdlg.cpp
字号:
// schedul_mfcDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "schedul_mfc.h"
#include "schedul_mfcDlg.h"
#include ".\schedul_mfcdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// Cschedul_mfcDlg 对话框
Cschedul_mfcDlg::Cschedul_mfcDlg(CWnd* pParent /*=NULL*/)
: CDialog(Cschedul_mfcDlg::IDD, pParent)
, m_pid(1)
, m_priority(11)
, m_time_slice(8)
, m_n_max_run(4)
, m_sched_kind(0)
, m_sleep(1000)
, m_npinfo(_T("No active process...0_0"))
, m_percent(_T(""))
, m_memory(20)
, m_mminfo(_T(""))
, m_usemm(FALSE)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
mmDlg.Create(IDD_DIALOG_MM,this);
}
void Cschedul_mfcDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_RESERVE, m_reserve);
DDX_Control(pDX, IDC_LIST_READY, m_active);
DDX_Control(pDX, IDC_LIST_HANG, m_hang);
DDX_Control(pDX, IDC_LIST_OVER, m_over);
DDX_Text(pDX, IDC_EDIT_PID, m_pid);
DDX_Text(pDX, IDC_EDIT_PRIO, m_priority);
DDX_Text(pDX, IDC_EDIT_NTIME, m_time_slice);
DDX_Text(pDX, IDC_EDIT_COUNT, m_n_max_run);
DDX_Radio(pDX, IDC_RADIO1, m_sched_kind);
DDX_Text(pDX, IDC_NPINFO, m_npinfo);
DDX_Text(pDX, IDC_PRECENT, m_percent);
DDX_Control(pDX, IDC_PROGRESS1, m_progressCtrl);
DDX_Text(pDX, IDC_EDIT_MEMORY, m_memory);
DDX_Text(pDX, IDC_MMINFO, m_mminfo);
DDX_Check(pDX, IDC_CHECK1, m_usemm);
}
BEGIN_MESSAGE_MAP(Cschedul_mfcDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BT_SET, OnBnClickedBtSet)
ON_BN_CLICKED(IDC_BT_QUIT, OnBnClickedBtQuit)
ON_BN_CLICKED(IDC_BT_ADDPROC, OnBnClickedBtAddproc)
ON_BN_CLICKED(IDC_BT_SHED, OnBnClickedBtShed)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BT_SET3, OnBnClickedBtSet3)
ON_BN_CLICKED(IDC_BT_SET4, OnBnClickedBtSet4)
ON_BN_CLICKED(IDC_BT_HANG, OnBnClickedBtHang)
ON_BN_CLICKED(IDC_BT_ACTIVE_HANG, OnBnClickedBtActiveHang)
ON_LBN_DBLCLK(IDC_LIST_READY, OnLbnDblclkListReady)
ON_LBN_DBLCLK(IDC_LIST_HANG, OnLbnDblclkListHang)
ON_BN_CLICKED(IDC_BT_WATCHMM, OnBnClickedBtWatchmm)
END_MESSAGE_MAP()
// Cschedul_mfcDlg 消息处理程序
BOOL Cschedul_mfcDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
GetDlgItem(IDC_BT_WATCHMM)->EnableWindow(0);
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void Cschedul_mfcDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void Cschedul_mfcDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR Cschedul_mfcDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void Cschedul_mfcDlg::OnBnClickedBtQuit()
{
OnCancel();
}
void Cschedul_mfcDlg::OnBnClickedBtSet()
{
shd.clear();
m_reserve.ResetContent();
m_active.ResetContent();
m_hang.ResetContent();
m_over.ResetContent();
UpdateData(1);
shd.n_max_run=m_n_max_run;
shd.sched_kind=m_sched_kind;
shd.usemm=m_usemm;
//for(p=shd.reserve.head;p!=shd.reserve.end;p=p->nextp)
//{
// str.Format("PID:%d P:%d T:%d-%d",p->pid,p->priority,p->time_slice,p->time_ran);
// m_reserve.AddString(str);
//}
Cpcb* p=shd.randpcb();
m_pid=p->pid;
m_priority=p->priority;
m_time_slice=p->time_slice;
shd.deletepcb(p);
GetDlgItem(IDC_BT_SHED)->EnableWindow(1);
m_npinfo="No active process...0_0";
m_progressCtrl.SetPos(0);
m_mminfo="";
if( !m_usemm )
GetDlgItem(IDC_BT_WATCHMM)->EnableWindow(0);
else
GetDlgItem(IDC_BT_WATCHMM)->EnableWindow(1);
UpdateData(0);
}
void Cschedul_mfcDlg::OnBnClickedBtAddproc()
{
UpdateData(1);
CString str;
Cpcb* p=shd.randpcb();
p->pid=m_pid;
p->priority=m_priority;
p->time_slice=m_time_slice;
p->memory=m_memory;
shd.add_to_reserve(p);
if( m_sched_kind==SCHED_PRIO )
{
//如果是按优先级调度,则排序显示
m_reserve.ResetContent();
Addtolistbox(m_reserve,shd.reserve);
}
else
{
str.Format("PID:%d P:%d T:%d-%d",p->pid,p->priority,p->time_slice,p->time_ran);
m_reserve.AddString(str);
}
p=shd.randpcb();
m_pid=p->pid;
m_priority=p->priority;
m_time_slice=p->time_slice;
m_memory=p->memory;
shd.deletepcb(p);
UpdateData(0);
}
void Cschedul_mfcDlg::Addtolistbox(CListBox& lb,Cpcblist& pl)
{
CString str;
for(Cpcb* p=pl.head;p!=pl.end;p=p->nextp)
{
str.Format("PID:%d P:%d T:%d-%d",p->pid,p->priority,p->time_slice,p->time_ran);
lb.AddString(str);
}
}
void Cschedul_mfcDlg::UpdateAll()
{
m_reserve.ResetContent();
Addtolistbox(m_reserve,shd.reserve);
m_active.ResetContent();
Addtolistbox(m_active,shd.active);
//m_hang.ResetContent();
//Addtolistbox(m_hang,shd.hang);
m_over.ResetContent();
Addtolistbox(m_over,shd.over);
SetNPinfo();
if( m_usemm && shd.active.count )
{
CString str;
str.Format("起始内存地址:%2d 内存大小:%d",shd.current->mm_begin,shd.current->memory);
m_mminfo=str;
}
else
m_mminfo="";
UpdateData(0);
}
void Cschedul_mfcDlg::SetNPinfo()
{
CString str,str2;
int percent;
if( shd.active.count || shd.hang.count )
{
if( shd.current ) shd.current=shd.active.head;
str.Format("PID:%d\t priotity:%d\t need time:%d\t 已运行:%d",
shd.current->pid,
shd.current->priority,
shd.current->time_slice,
shd.current->time_ran);
percent=int((float)shd.current->time_ran/shd.current->time_slice*100);
str2.Format("%3d%%",percent);
m_progressCtrl.SetRange(0,shd.current->time_slice);
m_progressCtrl.SetPos(shd.current->time_ran);
}
else if( shd.over.count )
{
str="All tasks are done! Let's have a rest...^_^!";
str2="";
}
m_npinfo=str;
m_percent=str2;
}
void Cschedul_mfcDlg::OnBnClickedBtShed()
{
shd.schedule();
SetTimer(1,m_sleep,0);
Addtolistbox(m_active,shd.active);
m_reserve.ResetContent();
Addtolistbox(m_reserve,shd.reserve);
SetNPinfo();
//使按钮变灰
GetDlgItem(IDC_BT_SHED)->EnableWindow(0);
UpdateData(0);
}
void Cschedul_mfcDlg::OnTimer(UINT nIDEvent)
{
//进程调度
if( shd.active.count || shd.hang.count )
shd.in_schedule();
else
KillTimer(1);
UpdateAll();
mmDlg.Invalidate();
CDialog::OnTimer(nIDEvent);
}
void Cschedul_mfcDlg::OnBnClickedBtSet3()
{
if( m_sleep>200 )
{
KillTimer(1);
m_sleep-=200;
SetTimer(1,m_sleep,0);
}
else
AfxMessageBox("不要了吧,你已经到了最高速度0.2秒了!");
}
void Cschedul_mfcDlg::OnBnClickedBtSet4()
{
if( m_sleep<2400 )
{
KillTimer(1);
m_sleep+=200;
SetTimer(1,m_sleep,0);
}
else
AfxMessageBox("不是吧,你都已经到了最低速度2秒了!");
}
void Cschedul_mfcDlg::OnBnClickedBtHang()
{
int i=m_active.GetCurSel();
if( LB_ERR==i ) AfxMessageBox("请选择一个进程挂起!");
else
{
CString str;
m_active.GetText(i,str);
int temp=str.Find(' ');
str=str.Left(temp);
str.Delete(0,4);
temp=atoi(str);
Cpcb* p=shd.active.findp(temp);
shd.add_to_hang(p);
m_active.ResetContent();
Addtolistbox(m_active,shd.active);
m_hang.ResetContent();
Addtolistbox(m_hang,shd.hang);
}
}
void Cschedul_mfcDlg::OnBnClickedBtActiveHang()
{
int i=m_hang.GetCurSel();
if( LB_ERR==i ) AfxMessageBox("请选择一个进程解挂!");
else
{
CString str;
m_hang.GetText(i,str);
int temp=str.Find(' ');
str=str.Left(temp);
str.Delete(0,4);
temp=atoi(str);
Cpcb* p=shd.hang.findp(temp);
shd.active_hang(p);
m_active.ResetContent();
Addtolistbox(m_active,shd.active);
m_hang.ResetContent();
Addtolistbox(m_hang,shd.hang);
}
}
void Cschedul_mfcDlg::OnLbnDblclkListReady()
{
OnBnClickedBtHang();
}
void Cschedul_mfcDlg::OnLbnDblclkListHang()
{
OnBnClickedBtActiveHang();
}
void Cschedul_mfcDlg::OnBnClickedBtWatchmm()
{
mmDlg.pshd=&shd;
mmDlg.ShowWindow(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -