Windows核心编程<读书笔记五>手把手写JobLab程序

【文起】亲爱的蟹儿,12点没去睡觉,不乖了,想多看点儿书,回去就能多陪陪你了。爱你奋斗

根据书上的程序,自己用MFC完成了书上的功能。

1、在OnInitDialog() 函数中对IDC_COMBO_PRIORITY 和 IDC_COMBO_SCHEDULING 初始化,并设定定时器函数。

CComboBox *pcom = (CComboBox *)GetDlgItem(IDC_COMBO_PRIORITY);

	pcom->InsertString(0,_T("No Limit"));
	pcom->InsertString(1,_T("Idle"));
	pcom->InsertString(2,_T("Below Normal"));
	pcom->InsertString(3,_T("Normal"));
	pcom->InsertString(4,_T("Above Normal"));
	pcom->InsertString(5,_T("High"));
	pcom->InsertString(6,_T("Realtime"));
	pcom->SetCurSel(0);

	CComboBox *pcomScheduling = (CComboBox *)GetDlgItem(IDC_COMBO_SCHEDULING);
	pcomScheduling->InsertString(0,_T("No Limit"));
	for (int i = 0;i < 10;i++)
	{
		TCHAR sz[] = {TCHAR('0' + i),0};
		//pcomScheduling->AddString(sz);
		pcomScheduling->InsertString(i+1,sz);
	}
	pcomScheduling->SetCurSel(0);

	SetTimer(TIME1,TIME_LEN,NULL);//设定定时器10s刷新一次

Create IO,并将此IO与JOB关联起来,同时申请一个进程来执行队列中的事情。该进程对应的函数为UINT WINAPI JobNotify(PVOID)        

         g_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
	g_hThreadIOCP = (HANDLE)_beginthreadex(NULL, 0, JobNotify, NULL, 0, NULL);
	g_hjob = CreateJobObject(NULL,_T("Job Lab"));
	JOBOBJECT_END_OF_JOB_TIME_INFORMATION joend = {JOB_OBJECT_TERMINATE_AT_END_OF_JOB};
	joend.EndOfJobTimeAction = JOB_OBJECT_TERMINATE_AT_END_OF_JOB;
	SetInformationJobObject(g_hjob,JobObjectEndOfJobTimeInformation,&joend,sizeof(joend));
	
	JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp = {(PVOID)COMPKEY_JOBOBJECT,g_hIOCP};
	SetInformationJobObject(g_hjob,JobObjectAssociateCompletionPortInformation,&joacp,sizeof(joacp));

2、添加ON_WM_TIMER消息的处理,会自动生成函数void CJobLabDlg::OnTimer(UINT_PTR nIDEvent),在定时器函数中,每10秒Post消息到队列中

void CJobLabDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (TIME1 == nIDEvent)
	{
		PostQueuedCompletionStatus(g_hIOCP,0,COMPKEY_STATUS,NULL);
	}

	//CDialog::OnTimer(nIDEvent);
}

同时,添加ON_WM_DESTROY的处理,用来kill定时器和释放job、IO等

void CJobLabDlg::OnDestroy()
{
	CDialog::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	KillTimer(TIME1);
	TerminateJobObject(g_hjob,0);

	PostQueuedCompletionStatus(g_hIOCP,0,COMPKEY_TERMINATE,NULL);

	WaitForSingleObject(g_hThreadIOCP,INFINITE);

	CloseHandle(g_hIOCP);
	CloseHandle(g_hThreadIOCP);
}


3、获取界面上的Job限制的信息,并且写入Job中,注意:MinimumWorkingSetSize  和 MaximumWorkingSetSize 必须同时赋值,不然会报错哦。

void CJobLabDlg::SetJobFunc()
{
	DWORD m_dwProcessLimitTime;
	CString m_strPriority,m_strScheduling;
	DWORD m_dwJobLimitTime;
	DWORD m_dwMinSize;
	DWORD m_dwMaxSize;
	DWORD m_dwProcessLimit;
	DWORD m_dwMask;
	DWORD m_dwMaxJob;
	DWORD m_dwMaxProcess;
	BOOL flag;
	CComboBox *pcomPri = (CComboBox *)GetDlgItem(IDC_COMBO_PRIORITY);
	CComboBox *pcomSche = (CComboBox *)GetDlgItem(IDC_COMBO_SCHEDULING);

	/* 开始基本限制 *
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值