【文起】亲爱的蟹儿,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);
/* 开始基本限制 *