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

📄 schedul_mfcdlg.cpp

📁 自己写的操作系统的实验:处理机调度模拟及内存分配模拟二合一小程序。
💻 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 + -