北京化工大学北方学院
课程设计报告
课程名称 系统软件实践
设计题目 Linux C 程序设计
专业、班级 软件1004
学 号 100220119
姓 名 张雄飞
指导教师 马睿
设计时间 20##年10月8日--20##年10月27日
20##年 10月 27 日
第二篇:操作系统 课程设计 处理机调度 图形界面 完整报告
目录
第一章 概述............................................................1
1.1 需求分析 ............................................................................ 1
1.2背景设计 ............................................................................. 1
第二章 概要设计 .....................................................2
第三章 详细设计 .....................................................4
3.1高响应比调度算法 ............................................................ 4
3.2时间片轮转法 ..................................................................... 5
3.3短进程优先法 ...................................................................... 7
第四章 调试分析与测试结果 ......................................9
第五章 总结..........................................................13
第六章 参考文献 ...................................................14
第七章 附录..........................................................15
第一章 概述
1.1 需求分析
进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用短作业优先调度算法,高响应比调度算法,时间片轮转调度算法实现进程调度。可以手动阻塞与唤醒。并用MFC实现图形界面。本实验可加深对进程调度算法的理解。
1.2背景设计
在OS中,调度的实质是一种资源分配,调度算法即指:根据系统的资源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;在分时系统中,为保证系统具有合理的响应时间,采用轮转法进行调度。采用算法时,则要考虑多方面因素,以便达到最佳效果。
1
第二章 概要设计
设计一个有多个进程共行的进程调度程序。
进程调度算法:短作业优先调度算法,高响应比调度算法,时间片轮转调度算法
每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、服务时间、进程状态等等。 struct progress
{
CString Name; //进程名称
CString Start; //创建时间
int ServiceT; //服务时间
int RunningT; //消逝时间
int RemainT;//剩余时间
int id;//进程标识符
CProgressCtrl* pro; //指向进度条的指针 int Rp;//进程成为就绪进程的时间
float prio;//进程优先权
};
进程的优先权为:响应时间/要求服务时间。
2
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪、执行、阻塞、完成。
就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
当阻塞进程时,将当前运行的进程移动到阻塞队列,并从就绪队列将下个进程移动到进程执行区(本程序中就绪队列中第一个即为正在执行进程,后文不再赘述)。
当添加或唤醒进程时,将添加标记m_bchange置为真,并将进程添加进就绪队列。
在运行一个时间片中,检查添加标记m_bchange是否为真,若为真,则判断单选框选中的算法,并按各自算法进行模拟调度,详见详细设计。
当执行区进程完成时,将之移动到已完成的队列,并判断就绪队列中是否有进程:若有,则将下一个进程添加进就绪队列;若无,则弹出提示窗口。
重复以上流程,直到用户退出。
3
第三章 详细设计
3.1高响应比调度算法
该算法在添加标记m_bchange为真且单选框选中“高响应比优先”时调用,分别通过每个进程前的队列中进程RemainT之和除以该进程的ServiceT,求出优先级prio,并根据prio重新为就绪队列排序。最后将m_bchange置为假。
if ( m_bchange ) { if(iRadioButton==IDC_RADIO1) { //计算优先级 for (int i=1;i<ProNum;i++) { float sum=0; for (int j=0;j<i;j++) { sum+=Pro[j].RemainT; } Pro[i].prio=sum/Pro[i].ServiceT; }//end for
4
//根据优先级排序 progress Tem; for ( i=0;i<ProNum-1;i++) { for (int j=0;j<ProNum-1-i;j++) { if (Pro[j].prio<Pro[j+1].prio) { Tem=Pro[j+1]; Pro[j+1]=Pro[j]; Pro[j]=Tem; } } } m_bchange=false; }//end 排序
3.2时间片轮转法
该算法在添加标记m_bchange为真且单选框选中“轮转调度”时调用, 5
直接将就绪队列相邻2个进程两两互换,最终达到将正在执行进程放置于就绪队列后,并将下一个将要执行的进程开始执行,输出结果,并将m_bchange置为真,以便继续轮转。
if(iRadioButton==IDC_RADIO2)
{ progress Tem; for ( int i=0;i<ProNum-1;i++) { Tem=Pro[i+1]; Pro[i+1]=Pro[i]; Pro[i]=Tem; }//end for m_bchange=true; Pro[0].pro->SetRange(0,Pro[0].ServiceT); Pro[0].RemainT--; Pro[0].RunningT++; m_Zhixing.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时间:%d秒 已运行时间:%d秒 优先权:%f\r\n",
Pro[0].id, Pro[0].Name, Pro[0].Start, 6
hixing);
Pro[0].ServiceT, Pro[0].RemainT, Pro[0].RunningT, Pro[0].prio); GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(m_ZPro[0].pro->SetPos(Pro[0].RunningT); }//end 排序
3.3短进程优先法
该算法在添加标记m_bchange为真且单选框选中“短进程优先”时调用,按照进程RemainT来重新排列队列顺序。最后将m_bchange置为假。
if(iRadioButton==IDC_RADIO3)
{progress Tem; for (int i=0;i<ProNum-1;i++) { for (int j=0;j<ProNum-1-i;j++) { if (Pro[j].RemainT>Pro[j+1].RemainT) { Tem=Pro[j+1]; 7
Pro[j+1]=Pro[j]; Pro[j]=Tem; }
}r
}
m_bchange=false;
}//end 排序
}
8
第四章 调试分析与测试结果
高响应比优先算法 9
轮转调度算法
10
短进程优先算法
进程的阻塞与唤醒
11
差错控制
12
第五章 总结
通过此次课程设计,更深入的理解了各个进程调度算法,及实现过程。熟悉了MFC环境的使用。增进了VC编程的水平。对进程或作业先来先服务、短作业优先算法,最高响应比算法,高优先权、按时间片轮转调度算法以及进程调度的概念和算法,有了更深入的认识!初步理解了操作系统对于作业处理的基本思想!并加深了我对于操作系统理论的理解。在此过程中,遇到了困难,能及时请教同学,查询相关资料,及时解决了问题,但仍有不足之处,将会在今后学习中更加努力。
13
第六章 参考文献
《计算机操作系统(第三版)》汤子瀛 西安电子科技大学出版社 《操作系统教程》方敏编 西安电子科技大学出版社 《操作系统原理与实践教程》周湘贞、曾宪权 清华出版社 《数据结构(C语言版)》严蔚敏 清华大学出版社
《深入浅出MFC(第2版)》侯俊杰 华中科技大学出版社
14
第七章 附录
pcb1.cpp:
#include "stdafx.h"
#include "pcb1.h"
#include "pcb1Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
BEGIN_MESSAGE_MAP(CPcb1App, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP()
CPcb1App::CPcb1App()
{
}
CPcb1App theApp;
BOOL CPcb1App::InitInstance() {
AfxEnableControlContainer(); #ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
CPcb1Dlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) 15
}
{ } else if (nResponse == IDCANCEL) { } return FALSE;
Pcb1.rc->
IDD_PCB1_DIALOG:
pcb1Dlg.cpp:
#include "stdafx.h"
#include "pcb1.h"
#include "pcb1Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__;
16
#endif
progress Pro[100]; //就绪队列
progress Zusai[100]; //阻塞队列
static int ProNum=0; //用来表示第n就绪进程 static int ZusaiNum=0; //用来表示第n阻塞进程 static int id=0;
int m_bchange;
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX);
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
CPcb1Dlg::CPcb1Dlg(CWnd* pParent )
{
CDialog::DoDataExchange(pDX); : CDialog(CPcb1Dlg::IDD, pParent) m_Jincheng = _T(""); 17
}
m_Jiuxu = _T(""); m_Wancheng = _T(""); m_Time = _T(""); m_Zhixing = _T(""); m_Zusai = _T(""); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
void CPcb1Dlg::DoDataExchange(CDataExchange* pDX) {
}
DDX_Text(pDX, IDC_EDIT_Zhixing, m_Zhixing); DDX_Text(pDX, IDC_EDIT_Zusai, m_Zusai); CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_PROGRESS1, m_progress); DDX_Text(pDX, IDC_EDIT_Jincheng, m_Jincheng); DDX_Text(pDX, IDC_EDIT_Jiuxu, m_Jiuxu); DDX_Text(pDX, IDC_EDIT_Wancheng, m_Wancheng); DDX_Text(pDX, IDC_EDIT_Time, m_Time);
BEGIN_MESSAGE_MAP(CPcb1Dlg, CDialog)
BOOL CPcb1Dlg::OnInitDialog()
{
ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_Huanxiang, OnBUTTONHuanxiang) ON_BN_CLICKED(IDC_BUTTON_Qingkong, OnBUTTONQingkong) ON_BN_CLICKED(IDC_BUTTON_Tianjia, OnBUTTONTianjia) ON_BN_CLICKED(IDC_BUTTON_Zuisai, OnBUTTONZuisai) ON_WM_TIMER() END_MESSAGE_MAP() CDialog::OnInitDialog(); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); 18
}
void CPcb1Dlg::OnSysCommand(UINT nID, LPARAM lParam) {
} if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; } dlgAbout.DoModal(); 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); ((CButton * )GetDlgItem( IDC_RADIO1 ))->SetCheck( TRUE ); return TRUE; else { CDialog::OnSysCommand(nID, lParam); }
void CPcb1Dlg::OnPaint()
{
if (IsIconic()) { CPaintDC dc(this); SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; 19
}
} else { } GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon); CDialog::OnPaint();
HCURSOR CPcb1Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//唤醒按扭
void CPcb1Dlg::OnBUTTONHuanxiang()
{
if ( ZusaiNum==0 ) { MessageBox("阻塞队列为空,没有可唤醒的进程","温馨提示",MB_OK|MB_ICONINFORMATION);
return;
}
Pro[ProNum]=Zusai[0]; int atime=this->getArrTime(); Pro[ProNum].Rp=atime;
ZusaiNum--;
ProNum++;
//阻塞的队列元素都前移一位
for (int i=0;i<ZusaiNum;i++)
{ Zusai[i]=Zusai[i+1]; } //显示就绪 m_Jiuxu.Empty(); CString T; for (i=1;i<ProNum;i++) { T.Empty(); T.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时间:%d20
秒 已运行时间:%d秒 优先权:%f\r\n",
} GetDlgItem(IDC_EDIT_Jiuxu)->SetWindowText(m_Jiuxu); //显示阻塞 m_Zusai.Empty(); for (i=0;i<ZusaiNum;i++) Pro[i].id, Pro[i].Name, Pro[i].Start, Pro[i].ServiceT, Pro[i].RemainT, Pro[i].RunningT, Pro[i].prio); m_Jiuxu+=T;
{
T.Empty();
T.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时间:%d秒 已运行时间:%d秒 优先权:%f\r\n",
} Zusai[i].id, Zusai[i].Name, Zusai[i].Start, Zusai[i].ServiceT, Zusai[i].RemainT, Zusai[i].RunningT, Zusai[i].prio); m_Zusai+=T; GetDlgItem(IDC_EDIT_Zusai)->SetWindowText(m_Zusai); m_bchange=true; SetTimer(1,1000,NULL);
}
//清空按扭
void CPcb1Dlg::OnBUTTONQingkong()
{
m_Wancheng.Empty(); UpdateData(false);
}
//添加按扭
void CPcb1Dlg::OnBUTTONTianjia()
{
UpdateData(true); if ( m_Jincheng.IsEmpty() ) 21
{ } MessageBox("请输入进程名称"); GetDlgItem(IDC_EDIT_Jincheng)->SetFocus(); return; if ( m_Time.IsEmpty() ) { } MessageBox("请输入服务时间"); GetDlgItem(IDC_EDIT_Time)->SetFocus(); return;
int atime=this->getArrTime(); Pro[ProNum].Name=m_Jincheng;
Pro[ProNum].pro=&m_progress; Pro[ProNum].RemainT=atoi(m_Time); Pro[ProNum].ServiceT=atoi(m_Time); Pro[ProNum].RunningT=0; Pro[ProNum].Start=(CTime::GetCurrentTime()).Format("%H:%M:%S"); Pro[ProNum].Rp=atime; Pro[ProNum].id=id+1; m_Jincheng.Empty(); m_Time.Empty(); UpdateData(false); id++; ProNum++;
if(ProNum>1)
{
CString Temple=""; for ( int i=1;i<ProNum;i++) { Temple.Format("进程名称:%s.exe 创建时间:%s 需要时间:%d 剩余时 Pro[i].Name, Pro[i].Start, Pro[i].ServiceT, Pro[i].RemainT, Pro[i].RunningT, Pro[i].prio); m_Jiuxu+=Temple; 22 间:%d 已运行时间:%d 优先权:%f\r\n",
} GetDlgItem(IDC_EDIT_Jiuxu)->SetWindowText(m_Jiuxu); } SetTimer(1,1000,NULL); m_bchange=true;
}
//阻塞按扭
void CPcb1Dlg::OnBUTTONZuisai()
{
int i; if ( ProNum<=0 ) { } else { Zusai[ZusaiNum++]=Pro[0]; m_Zusai.Empty(); CString Temple=""; //显示阻塞 for ( i=0;i<ZusaiNum;i++) KillTimer(1); MessageBox("当前没有进程在执行,请添加或唤醒进程"); return;
{
Temple.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时间:%d秒 已运行时间:%d秒 优先权:%f\r\n",
} Zusai[i].id, Zusai[i].Name, Zusai[i].Start, Zusai[i].ServiceT, Zusai[i].RemainT, Zusai[i].RunningT, Zusai[i].prio); m_Zusai+=Temple; GetDlgItem(IDC_EDIT_Zusai)->SetWindowText(m_Zusai); //更新进度条,将进程条和运行清空 Pro[0].pro->SetPos(0); GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(_T("")); 23
ProNum--; if ( ProNum<=0 ) { KillTimer(1); MessageBox("当前没有进程在执行,请添加或唤醒进程"); } //BlockNum++ int atime=this->getArrTime(); //因为第一个元素空了,所以数组要前移 return; double temp=0; double High; int highidex; for(i=1;i<=ProNum;i++) } { High=((double)atime-(double)Pro[i].Rp)/(double)Pro[i].ServiceT; if(High>=temp) { temp=High; } highidex=i; Pro[0]=Pro[highidex]; for ( i=highidex;i<ProNum;i++) { } Pro[i]=Pro[i+1]; for (i=highidex;i<ProNum;i++) { } Pro[i]=Pro[i+1]; } m_bchange=true;
}
//或取变为就绪进程的时间函数 int CPcb1Dlg::getArrTime() {
CTime time=CTime::GetCurrentTime(); int Arrtime; Arrtime=time.GetHour()*3600+time.GetMinute()*60+time.GetSecond(); 24
return Arrtime;
}
void CPcb1Dlg::OnTimer(UINT nIDEvent)
{int iRadioButton; iRadioButton=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3); if(iRadioButton!=IDC_RADIO2) {Pro[0].pro->SetRange(0,Pro[0].ServiceT);
Pro[0].RemainT--; Pro[0].RunningT++; m_Zhixing.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时 Pro[0].id, Pro[0].Name, Pro[0].Start, Pro[0].ServiceT, Pro[0].RemainT, Pro[0].RunningT, 间:%d秒 已运行时间:%d秒 优先权:%f\r\n", Pro[0].prio); GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(m_Zhixing); Pro[0].pro->SetPos(Pro[0].RunningT); } //如果添加了新的成员,重新排序 if ( m_bchange ) { if(iRadioButton==IDC_RADIO1) { //计算优先级 for (int i=1;i<ProNum;i++) { float sum=0; for (int j=0;j<i;j++) { sum+=Pro[j].RemainT; } Pro[i].prio=sum/Pro[i].ServiceT; }//end for //根据优先级排序 progress Tem; for ( i=0;i<ProNum-1;i++) { for (int j=0;j<ProNum-1-i;j++) { if (Pro[j].prio<Pro[j+1].prio) 25
} } { } Tem=Pro[j+1]; Pro[j+1]=Pro[j]; Pro[j]=Tem; m_bchange=false; }//end 排序
if(iRadioButton==IDC_RADIO2)
{ progress Tem; for ( int i=0;i<ProNum-1;i++) { } Tem=Pro[i+1]; Pro[i+1]=Pro[i]; Pro[i]=Tem;
m_bchange=true;
Pro[0].pro->SetRange(0,Pro[0].ServiceT);
Pro[0].RemainT--;
Pro[0].RunningT++;
m_Zhixing.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时间:%d秒 已运行时间:%d秒 优先权:%f\r\n",
Pro[0].id, Pro[0].Name, Pro[0].Start, Pro[0].ServiceT, Pro[0].RemainT, Pro[0].RunningT, Pro[0].prio); GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(m_Zhixing); Pro[0].pro->SetPos(Pro[0].RunningT); }//end 排序
if(iRadioButton==IDC_RADIO3)
{ progress Tem; for (int i=0;i<ProNum-1;i++) { for (int j=0;j<ProNum-1-i;j++) { 26
} if (Pro[j].RemainT>Pro[j+1].RemainT) { } Tem=Pro[j+1]; Pro[j+1]=Pro[j]; Pro[j]=Tem; } m_bchange=false; }//end 排序 } //如果已经完成 if ( Pro[0].RemainT<=0 ) { ProNum--; m_Wancheng+=m_Zhixing; m_Zhixing=_T(""); //Sleep(100); Pro[0].pro->SetPos(0); UpdateData(false); GetDlgItem(IDC_EDIT_Wancheng)->SetWindowText(m_Wancheng); //如果没有就绪的进程 if( ProNum==0 ) { KillTimer(1); GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(_T("")); MessageBox("当前没有进程在执行,请添加或唤醒进程!"); } //还有就绪的进程 else { int i; int atime=this->getArrTime(); //因为第一个元素空了,所以数组要前移 double temp=0; double High; int highidex; for(i=1;i<=ProNum;i++) { High=((double)atime-(double)Pro[i].Rp)/(double)Pro[i].ServiceT; if(High>=temp) { temp=High; highidex=i; 27
}
} } Pro[0]=Pro[highidex]; for ( i=highidex;i<ProNum;i++) { } CString Temple=""; for ( i=1;i<ProNum;i++) { } Temple.Format(" 标识符:%d 进程名称:%s.exe 创建时间:%s 需要时 Pro[i].id, Pro[i].Name, Pro[i]=Pro[i+1]; 间:%d 剩余时间:%d 已运行时间:%d 优先权:%f\r\n", Pro[i].Start, Pro[i].ServiceT, Pro[i].RemainT, Pro[i].RunningT, Pro[i].prio); m_Jiuxu+=Temple; GetDlgItem(IDC_EDIT_Jiuxu)->SetWindowText(m_Jiuxu); } m_bchange=true; }//end 完成 m_Jiuxu=""; CString Temple=""; for ( int i=1;i<ProNum;i++) { Temple.Format("标识符:%d 进程名称:%s 创建时间:%s秒 需要时间:%d秒 剩余时 } GetDlgItem(IDC_EDIT_Jiuxu)->SetWindowText(m_Jiuxu); CDialog::OnTimer(nIDEvent); Pro[i].id, Pro[i].Name, Pro[i].Start, Pro[i].ServiceT, Pro[i].RemainT, Pro[i].RunningT, Pro[i].prio); m_Jiuxu+=Temple; 间:%d秒 已运行时间:%d秒 优先权:%f\r\n", 28
StdAfx.cpp:
#include "stdafx.h"
pcb1.h:
#if !defined(AFX_PCB1_H__D0EC9916_5956_47D0_A87D_BF26EFBECAD7__INCLUDED_) #define AFX_PCB1_H__D0EC9916_5956_47D0_A87D_BF26EFBECAD7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h"
class CPcb1App : public CWinApp
{
public:
CPcb1App(); public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP()
};
#endif
pcb1Dlg.h:
#if !defined(AFX_PCB1DLG_H__85A9A06E_CC92_4F5B_B772_4E1D184B7433__INCLUDED_)
#define AFX_PCB1DLG_H__85A9A06E_CC92_4F5B_B772_4E1D184B7433__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif
struct progress
{
CString Name; //进程名称 CString Start; //创建时间 29
int ServiceT; //服务时间 int RunningT; //消逝时间 int RemainT;//剩余时间 int id;//进程标识符 CProgressCtrl* pro; //指向进度条的指针 int Rp;//进程成为就绪进程的时间 float prio;//进程优先权
};
class CPcb1Dlg : public CDialog
{
public:
int getArrTime();
CString m_Zhixing; CString m_Zusai; protected: virtual void DoDataExchange(CDataExchange* pDX); CPcb1Dlg(CWnd* pParent = NULL); enum { IDD = IDD_PCB1_DIALOG }; CProgressCtrl m_progress; CString m_Jincheng; CString m_Jiuxu; CString m_Wancheng; CString m_Time;
protected:
};
#endif HICON m_hIcon; virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnBUTTONHuanxiang(); afx_msg void OnBUTTONQingkong(); afx_msg void OnBUTTONTianjia(); afx_msg void OnBUTTONZuisai(); afx_msg void OnTimer(UINT nIDEvent); DECLARE_MESSAGE_MAP()
Resource.h:
30
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_PCB1_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_EDIT_Jincheng 1000
#define IDC_EDIT_Time 1001
#define IDC_BUTTON_Tianjia 1002
#define IDC_EDIT_Jiuxu 1003
#define IDC_EDIT_Zhixing 1004
#define IDC_PROGRESS1 1005
#define IDC_EDIT_Zusai 1006
#define IDC_EDIT_Wancheng 1007
#define IDC_BUTTON_Zuisai 1008
#define IDC_BUTTON_Huanxiang 1009
#define IDC_BUTTON_Qingkong 1010
#define IDC_RADIO1 1011
#define IDC_RADIO2 1012
#define IDC_RADIO3 1013
#define IDC_EDIT_Time2 1014
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1012
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
StdAfx.h:
#if !defined(AFX_STDAFX_H__475878FC_206D_4B1D_8B95_B000C92EBF8F__INCLUDED_)
#define AFX_STDAFX_H__475878FC_206D_4B1D_8B95_B000C92EBF8F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif
#define VC_EXTRALEAN
31
#include <afxwin.h>
#include <afxext.h>
#include <afxdisp.h>
#include <afxdtctl.h>
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>
#endif
pcb1.rc2:
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++ #endif
32