Министерство высшего и профессиональной образования РФ
НГТУ
Кафедра ВТ
Курсовая работа по дисциплине
«Вычислительные комплексы системы и сети»
Факультет: АВТ
Группа: АМ-79
Студент:
Преподаватель:
Новосибирск 2001 год.
Содержание
Стр.
Задание на курсовую работу 3
Введение 4
Описание алгоритма перераспределения заданий 5
Описание интерфейса программы 6
Результаты работы программы 7
Выводы 10
Список литературы 11
Приложение 1 (текст программы) 12
Задание.
Задана структура вычислительной системы: трехмерная с размерностью 4х4х3. Задачи вводятся пользователем (задается трудоемкость и время выполнения задачи). В случае выхода из строя узла (узел выводится из строя пользователем), разработать алгоритм перераспределения задач в системе. Если для задачи не хватает ресурса, предусмотреть постановку задачи в очередь. При истечении времени выполнения задачи предусмотреть выход задачи из системы.
Введение.
Система считается отказоустойчивой или нечувствительной к неисправностям, если ее организация предусматривает устранение последствий неисправностей или отказов элементов и программного обеспечения системы за счет использования аппаратной, информационной и алгоритмической избыточности.
Существует достаточно большое число способов введения избыточности в систему. Круг задач, решаемых системой, обычно определен, поэтому часто используется более узкое определение отказоустойчивости - как способность правильно выполнять заданные алгоритмы и программы даже при наличии отказов в аппаратуре и программных средствах.
|
где:
Pi - мощность i-ой машины;
Vj - требуемая мощность для решения j-го задания;
n - количество рабочих машин;
k - количество заданий в системе.
Множество заданий, которые должны быть выполнены вычислительной системой, рассматривается как набор вычислительных объектов. Считаем, что задания (процессы) могут выполнятся параллельно. Выполнение этих процессов в распределенных вычислительных системах потенциально имеет более высокую производительность по сравнению с однопроцессорными системами. Однако в распределенных системах, возникают проблемы, требующие своего решения.
Целью данной работы является решение проблемы, суть которой состоит в организации вычислительной системы таким образом, чтобы ее производительность плавно снижалась при появлении неисправностей в машинах. Здесь возникает проблема перераспределения нагрузки неисправных машин.
Описание алгоритма перераспределения заданий.
Для перераспределения задач с неисправной машины разработан рекурсивный алгоритм перераспределения. Разработаны две структуры: структура описание процессора и структура описания задания. Функция перераспределения задания называется: CVkssDlg::RasprZad ().
Алгоритм можно представить следующим образом:
1. Просматриваем рабочие процессоры, есть ли свободные ресурсы на процессоре для размещения задания. Если есть, задание распределяется на рабочий процессор и алгоритм заканчивается;
2. Если задание не помещается целиком на один процессор, то свободные ресурсы всех процессоров суммируются, и сравнивается с требуемыми ресурсами задания;
3. Далее если общих ресурсов работающих процессоров хватает для распределения задания, то находится рабочий процессор со свободными ресурсами, и от задания отделяется часть, которая полностью займет свободные ресурсы этого процессора. От остальной части вычитается распределенная часть. После чего алгоритм запускается снова - п.1 (рекурсия).
4. Если же и общих ресурсов работающих процессоров не хватает, то задача ставится в очередь на выполнение и выдается сообщение о том, что система перегружена.
5. Далее при завершении выполнения какой-либо задачи (и следовательно освобождение ресурсов процессора) задачи из очереди поступают в систему (снова вызывается функция распределения задач – п.1).
Описание интерфейса программы.
После запуска программы на экране появляется главное окно рис.1., в котором изображена структура системы. После выбора пункта «Параметры» в меню File программа предлагает ввести задачи (количество необходимых ресурсов и время выполнения) и распределяет их на процессоры. Неработающие процессоры зачеркиваются крестиком, а процессоры, загруженные на сто процентов – закрашиваются черным цветом.
Также возле каждого процессора отображается его загруженность в процентах.
В специальном окне информации можно посмотреть какая задача выполняется на каком процессоре, сколько ресурсов она занимает на данном процессоре, а также время, оставшееся до конца выполнения задачи.
Кнопка «Добавить задачу» - вводит задачу в систему.
Кнопка «Сломать» - служит для вывода процессора из строя (удаления из системы).
Кнопка «Таймер» - служит для имитации течения времени в системе.
Результат работы программы.
На рис. 1 приведена общая структура системы.

Рис. 1 Главное окно программы.
Далее на рис. 2 приводится пример работы системы при выводе из строя нескольких узлов (неработающие узлы обозначены крестом). При этом происходит перераспределение задач на свободные процессоры.

Рис. 2 Перераспределение задач при выходе из строя процессора.
В системе находится две задачи (задача 1 и задача 3). Трудоемкость задачи 1 равна 120, она распределена на процессоры CPU 1 (Р=100) и CPU 2 (P=20), оставшееся время выполнения 3 (время = 3); трудоемкость задачи 3 равна 900 (задача 3 распределена на процессоры CPU 2 (Р=80), 3 (Р=100) , 4 (Р=100) , 6 (Р=100) , 7 (Р=100) , 9 (Р=100) , 11 (Р=100) , 12 (Р=100) , 13 (Р=100) , 14 (Р=20), т. к. CPU 5,8,10 – выведены из строя).
![]() |
На рис.3 у задачи 3 закончилось время выполнения и она была удалена из системы.
Рис. 3 Удаление задачи из системы при окончании времени ее выполнения.
![]() |
На рис. 4 представлена ситуация, когда при выводе из строя процессора CPU 27 система оказывается перегруженной, часть задачи с CPU 27 перераспределяется на свободный ресурс CPU 48 (Р=30), а остальная часть (Р=70) ставится в очередь на выполнение и ожидает когда в системе появится свободный ресурс.

Рис. 4 Задача ставится в очередь на выполнение.
На рис. 5 задача 1 (Р= 120) вышла из системы и освободила CPU 1 (P=100) и
CPU 2 (P=20), а часть задачи 4 (Р=70) из очереди занимает ресурс CPU 1 (P=70).
Рис. 5 Задача из очереди занимает освободившийся ресурс.
Выводы
В соответствии с заданием была разработана система и разработан алгоритм перераспределения заданий. В процессе тестирования работы, алгоритм работает корректно и выполняет все требуемые задачи: перераспределение и удаление заданий. Среди систем, реализующих непрерывную работу программ, этот алгоритм наиболее выгоден. Т. к. не требуется дополнительное количество резервных процессоров, не нужно устройство переконфигурации связей между ПЭ, а всю работу выполняет маленькая микропрограмма в ПЗУ/ОЗУ. Таким образом система будет продолжать работать и в случае выхода из строя каких-либо процессоров (в отличие от других систем где работа прекращается).
Список литературы.
1. «Вычислительные системы большой производительности», НГТУ, метод. пособие, 1993.
2. Г. Курс лекций. (7 семестр).
Приложение 1 .
// cpu. h : header file
/////////////////////////////////////////////////////////////////////////////
class cpu
{
public:
cpu(int);
int numcpu;//номер CPU
int bitrab;//признак работоспособности
int pnumzad[100];// номера задач, которые обрабатывает этот CPU
int ppispcpu[100];//трудоемкость этих задач на данном CPU
int kolzad;
// Implementation
public:
virtual ~cpu();
protected:
//{{AFX_MSG(cpu)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
};
// cpu. cpp : implementation file
#include "stdafx. h"
#include "vkss1.h"
#include "cpu. h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
cpu::cpu(int a)
{ numcpu=a;
bitrab=1;
kolzad=0;
for(int i=0;i<100;i++)
{
pnumzad[i]=0;
ppispcpu[i]=0;
}
}
cpu::~cpu()
{
}
/////////////////////////////////////////////////////////////////////////////
// zadacha. h : header file
//
class zadacha
{
public:
zadacha();
public:
int numzad;// № задачи
int P;//мощность
int time;
int numcpu[110];//Номер CPU которые обрабатывают эту задачу
public:
virtual ~zadacha();
protected:
};
/////////////////////////////////////////////////////////////////////////////
// zadacha. cpp : implementation file
//
#include "stdafx. h"
#include "vkss1.h"
#include "zadacha. h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
zadacha::zadacha()
{for(int r=0;r<110;r++)numcpu[r]=0;}
zadacha::~zadacha()
{}
// Vkss1Dlg. h : header file
//
#include "zadacha. h"
#include "cpu. h"
class CVkss1Dlg : public CDialog
{
public:
CVkss1Dlg(CWnd* pParent = NULL); // standard constructor
~CVkss1Dlg();
enum { IDD = IDD_VKSS1_DIALOG };
CListBox m_Lcpu;
int m_P;
int m_time;
int m_numzp;
int m_ndelcpu;
zadacha *m_pz[100];
zadacha *ocher[300];
int kolzocher;
int m_kolz;// колич задач в системе
cpu *m_pcpu[48];
void RasprZad(zadacha*,int);
void DelstrLcpu();
void AddstrLcpu();
int SumT();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
protected:
afx_msg void OnAddZad();
afx_msg void OnChangeEdit1();
afx_msg void OnChangendelcpu();
afx_msg void OnClok();
afx_msg void OnDestroy();
afx_msg void Ondelcpu();
afx_msg void OnChangeEdit2();
};
// Vkss1Dlg. cpp : implementation file
//
#include "stdafx. h"
#include "vkss1.h"
#include "Vkss1Dlg. h"
#include "zadacha. h"
#include "cpu. h"
#include "MainFrm. h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CVkss1Dlg::CVkss1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CVkss1Dlg::IDD, pParent)
{kolzocher=0;
//{{AFX_DATA_INIT(CVkss1Dlg)
m_P = 1;
m_time = 1;
m_numzp = 1;
m_ndelcpu = 1;
//}}AFX_DATA_INIT
m_kolz=0;
CMainFrame *pp=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
for (int i=0;i<48;i++)
{
m_pcpu[i]=new cpu(i+1);
pp->pcpumf[i]=m_pcpu[i];
if(m_pcpu[i]==NULL)AfxMessageBox("Не могу выделить память");
}
for (int i1=0;i1<100;i1++) m_pz[i1]=NULL;
}
CVkss1Dlg::~CVkss1Dlg()
{//AfxMessageBox("faaaaaaaaaaaa");}
void CVkss1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_Lcpu, m_Lcpu);
DDX_Text(pDX, IDC_EDIT1, m_P);
DDV_MinMaxInt(pDX, m_P, 1, 4800);
DDX_Text(pDX, IDC_EDIT2, m_time);
DDV_MinMaxInt(pDX, m_time, 1, 50);
DDX_Text(pDX, IDC_EDIT3, m_numzp);
DDX_Text(pDX, IDC_ndelcpu, m_ndelcpu);
DDV_MinMaxInt(pDX, m_ndelcpu, 1, 48);
}
BEGIN_MESSAGE_MAP(CVkss1Dlg, CDialog)
//{{AFX_MSG_MAP(CVkss1Dlg)
ON_BN_CLICKED(IDC_BUTTON1, OnAddZad)
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
ON_EN_CHANGE(IDC_ndelcpu, OnChangendelcpu)
ON_BN_CLICKED(IDC_Clok, OnClok)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_delcpu, Ondelcpu)
ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
void CVkss1Dlg::OnAddZad()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_P<1||m_P>4800)
{AfxMessageBox("Введите мощность от 1 до 4800");return;}
if(m_time<1||m_time>4800)
{AfxMessageBox("Введите время от 1 до 50");return;}
if(m_kolz>99)
{AfxMessageBox("Система расчитана только на 100 задач. Дождитесь окончания выполнения какой-нибудь задачи !");return;}
if((m_pz[m_kolz]=new zadacha)==NULL)
{AfxMessageBox("Не могу выделить память!");return;}
m_pz[m_kolz]->P=m_P;
m_pz[m_kolz]->time=m_time;
m_pz[m_kolz]->numzad=m_numzp;
int SumTr=0;
SumTr=SumT();
if(m_P>4800-SumTr)
{
AfxMessageBox("Система перегружена!!! ВВод задачи невозможен");
delete m_pz[m_kolz];
return;
}
RasprZad(m_pz[m_kolz],m_P);
m_kolz++;
AddstrLcpu();
m_numzp++;
UpdateData(FALSE);
}
int CVkss1Dlg::SumT()
{
int SumTr=0;
for(int i=0;i<48;i++)
{if(m_pcpu[i]->bitrab==0){SumTr+=100;continue;}
for(int j=1;j<=m_pcpu[i]->kolzad;j++)
{
SumTr+=m_pcpu[i]->ppispcpu[j-1];
}
}
return SumTr;
}
void CVkss1Dlg::RasprZad(zadacha *z, int ostat)
{ int SumTr=0;
if(ostat==0){/*AfxMessageBox("Задача введена");*/return;}
for(int i=0;i<48;i++)
{ if(m_pcpu[i]->bitrab==0)continue;
for(int j=1;j<=m_pcpu[i]->kolzad;j++)
SumTr+=m_pcpu[i]->ppispcpu[j-1];
if(SumTr<100)
{
int p1=m_pcpu[i]->kolzad;
if(ostat>=100-SumTr)//если трудоемкость >= 100
{
m_pcpu[i]->pnumzad[p1]=z->numzad;
m_pcpu[i]->ppispcpu[p1]=100-SumTr;
m_pcpu[i]->kolzad=m_pcpu[i]->kolzad+1;
ostat=ostat-(100-SumTr);
for(int h=0;z->numcpu[h]!=0 && h<110;h++);
if(h>=110){AfxMessageBox("! kosyak!");}
z->numcpu[h]=m_pcpu[i]->numcpu;
RasprZad(z, ostat);// AfxMessageBox("Зада ll.");
return;
}
else
{
m_pcpu[i]->pnumzad[p1]=z->numzad;
m_pcpu[i]->ppispcpu[p1]=ostat;
m_pcpu[i]->kolzad+=1;
ostat=0;
for(int h=0;z->numcpu[h]!=0 && h<110;h++);
if(h>=110){AfxMessageBox("! kosyak!");}
z->numcpu[h]=m_pcpu[i]->numcpu;
return;
}
}
SumTr=0;
}
char fff[3];
itoa(z->numzad, fff,10);
CString s2="! Система не справляется с заданиями! ";
s2+="Задача № ";
s2+=fff;
s2+=" ставится в очередь.";
AfxMessageBox(s2);
zadacha *zoch=new zadacha;
zoch->P=ostat;
zoch->numzad=z->numzad;
zoch->time=z->time;
ocher[kolzocher++]=zoch;
}
void CVkss1Dlg::AddstrLcpu()
{
DelstrLcpu();
char f[10],f1[3],f2[3],f3[4];
int SumTr=0;
for(int i=0;i<48;i++)
{
if(m_pcpu[i]->bitrab==0)
{
itoa(m_pcpu[i]->numcpu, f,10);
CString s1="!!! Процессор ";
s1+=f;s1+= " НЕ работает!!!";
m_Lcpu. AddString(s1);
continue;
}
for(int j=1;j<=m_pcpu[i]->kolzad;j++)
{
SumTr=m_pcpu[i]->ppispcpu[j-1];
if(SumTr!=0)
{int dd=m_pcpu[i]->pnumzad[j-1];
itoa(m_pcpu[i]->numcpu, f,10);
itoa(m_pcpu[i]->pnumzad[j-1],f1,10);
itoa(SumTr, f2,10);
for(int k=0;k<m_kolz;k++)
{
if(m_pz[k]->numzad==dd)
{
itoa(m_pz[k]->time, f3,10);
break;
}
}
CString s="CPU ";
s+=f;s+=" вып. задачу ";
s+=f1;s+=", P=";
s+=f2;
s+=", Время = ";
s+=f3;
m_Lcpu. AddString(s);
}
}
}
CMainFrame *pp=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
pp->Invalidate(NULL);
}
void CVkss1Dlg::DelstrLcpu()
{int i=m_Lcpu. GetCount();
for(;i>0;i--)m_Lcpu. DeleteString(i-1);
}
void CVkss1Dlg::OnDestroy()
{ CMainFrame *pp=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
for (int i=0;i<48;i++)
{pp->pcpumf[i]=NULL;
if(m_pcpu[i])delete m_pcpu[i];}
for (int k=0;k<m_kolz;k++)
{if(m_pz[k])delete m_pz[k];}
pp->Invalidate(NULL);
CDialog::OnDestroy();
}
void CVkss1Dlg::Ondelcpu()
{
if(m_ndelcpu<=0||m_ndelcpu>48)
{AfxMessageBox("Введите номер CPU от 1 до 48");return;}
int nz=0,trz=0,flag1=0;
m_pcpu[m_ndelcpu-1]->bitrab=0;
for(int i=0;i<m_pcpu[m_ndelcpu-1]->kolzad;i++)
{
nz=m_pcpu[m_ndelcpu-1]->pnumzad[i];
//m_pcpu[m_ndelcpu-1]->pnumzad[i]=0;
trz=m_pcpu[m_ndelcpu-1]->ppispcpu[i];
//for(int r=i;m_pcpu[m_ndelcpu-1]->pnumzad[r]!=0;r++)
//m_pcpu[m_ndelcpu-1]->ppispcpu[i]=0;
for(int k=0;k<m_kolz;k++)
{
if(m_pz[k]->numzad==nz)
{
flag1=0;
for(int a=0;m_pz[k]->numcpu[a]!=0;a++)
{
if(m_pz[k]->numcpu[a]==m_pcpu[m_ndelcpu-1]->numcpu)
{
for(int g=a;m_pz[k]->numcpu[g]!=0;g++)
{
m_pz[k]->numcpu[g]=m_pz[k]->numcpu[g+1];
}
}
}
RasprZad(m_pz[k],trz);
break;
}
}
}
m_pcpu[m_ndelcpu-1]->kolzad=0;
AddstrLcpu();
}
void CVkss1Dlg::OnChangeEdit1()
{UpdateData(TRUE);}
void CVkss1Dlg::OnChangeEdit2()
{UpdateData(TRUE);}
void CVkss1Dlg::OnChangendelcpu()
{UpdateData(TRUE);}
void CVkss1Dlg::OnClok()
{int fl=0,flocher=0;
// TODO: Add your control notification handler code here
for(int i=0;i<m_kolz;i++)
{
m_pz[i]->time-=1;
if(m_pz[i]->time==0)
{flocher=1;
for(int x=0;m_pz[i]->numcpu[x]!=0;x++)
{ int gg=m_pz[i]->numcpu[x]-1;
for(int v=0;v<m_pcpu[gg]->kolzad;v++)
{
if(m_pz[i]->numzad==m_pcpu[gg]->pnumzad[v])
{
for(int n=v;m_pcpu[gg]->pnumzad[n]!=0;n++)
{
m_pcpu[gg]->pnumzad[n]=m_pcpu[gg]->pnumzad[n+1];
m_pcpu[gg]->ppispcpu[n]=m_pcpu[gg]->ppispcpu[n+1];
//fl=1;
}
m_pcpu[gg]->kolzad=m_pcpu[gg]->kolzad-1;
v=0;
}
}
}
zadacha *g=m_pz[i];
for(int t=i;m_pz[t]!=NULL;t++)
{
m_pz[t]=m_pz[t+1];
}
if(g!=NULL){delete g;}
m_kolz--;i--;
}
}
AddstrLcpu();
if(kolzocher==0)return;
int SumTr=0;
for(;kolzocher>0;)
{//if(ocher[kolzocher-1]->P>4800-SumTr)
SumTr=SumT();
if(4800-SumTr<=0)
{AddstrLcpu();
//AfxMessageBox("Система перегружена!!! ВВод задачи невозможен");
//delete m_pz[m_kolz];
return;
}
//AfxMessageBox("Система перегруже");
m_pz[m_kolz]=ocher[--kolzocher];
RasprZad(m_pz[m_kolz],m_pz[m_kolz]->P);
m_kolz++;
AddstrLcpu();
}
//m_numzp++;
//UpdateData(FALSE);
}
// vkss1View. h : interface of the CVkss1View class
#include "Vkss1Dlg. h"
class CVkss1View : public CView
{
protected: // create from serialization only
CVkss1View();
DECLARE_DYNCREATE(CVkss1View)
public:
CVkss1Doc* GetDocument();
public:
CDC m_memDC;
CBitmap m_bmp;
CBrush m_bkbrush;
int maxX, maxY, one;
afx_msg void virtwin();
afx_msg void WhiteBckgn();
// Overrides
//{{AFX_VIRTUAL(CVkss1View)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
//}}AFX_VIRTUAL
public:
virtual ~CVkss1View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
protected:
//{{AFX_MSG(CVkss1View)
afx_msg void OnParametrs();
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in vkss1View. cpp
inline CVkss1Doc* CVkss1View::GetDocument()
{ return (CVkss1Doc*)m_pDocument; }
#endif
// vkss1View. cpp : implementation of the CVkss1View class
//
#include "stdafx. h"
#include "vkss1.h"
#include "vkss1Doc. h"
#include "vkss1View. h"
#include "Vkss1Dlg. h"
#include "MainFrm. h"
IMPLEMENT_DYNCREATE(CVkss1View, CView)
BEGIN_MESSAGE_MAP(CVkss1View, CView)
//{{AFX_MSG_MAP(CVkss1View)
ON_COMMAND(ID_Parametrs, OnParametrs)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
CVkss1View::CVkss1View()
{one=0;}
CVkss1View::~CVkss1View()
{}
BOOL CVkss1View::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
void CVkss1View::OnDraw(CDC* pDC)
{virtwin();
CMainFrame *pp=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
CVkss1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int r=7;
CPen pdk1,pgre;
CPen *old;
COLORREF clk1=0x;
COLORREF clgre=0x00ff0000;
pdk1.CreatePen(PS_SOLID,2,clk1);
pgre. CreatePen(PS_SOLID,1,clgre);
for(int g=0;g<16;g++)
{old=m_memDC. SelectObject(&pdk1);
m_memDC. Ellipse(pp->pl1[g][0]-r, pp->pl1[g][1]-r, pp->pl1[g][0]+r, pp->pl1[g][1]+r);
m_memDC. Ellipse(pp->pl2[g][0]-r, pp->pl2[g][1]-r, pp->pl2[g][0]+r, pp->pl2[g][1]+r);
m_memDC. Ellipse(pp->pl3[g][0]-r, pp->pl3[g][1]-r, pp->pl3[g][0]+r, pp->pl3[g][1]+r);
m_memDC. MoveTo(pp->pl1[g][0],pp->pl1[g][1]);
m_memDC. LineTo(pp->pl3[g][0],pp->pl3[g][1]);
m_memDC. SelectObject(old);
}
old=m_memDC. SelectObject(&pdk1);
m_memDC. MoveTo(pp->pl1[0][0],pp->pl1[0][1]);
m_memDC. LineTo(pp->pl1[3][0],pp->pl1[3][1]);
m_memDC. MoveTo(pp->pl1[4][0],pp->pl1[4][1]);
m_memDC. LineTo(pp->pl1[7][0],pp->pl1[7][1]);
m_memDC. MoveTo(pp->pl1[8][0],pp->pl1[8][1]);
m_memDC. LineTo(pp->pl1[11][0],pp->pl1[11][1]);
m_memDC. MoveTo(pp->pl1[12][0],pp->pl1[12][1]);
m_memDC. LineTo(pp->pl1[15][0],pp->pl1[15][1]);
m_memDC. MoveTo(pp->pl1[0][0],pp->pl1[0][1]);
m_memDC. LineTo(pp->pl1[12][0],pp->pl1[12][1]);
m_memDC. MoveTo(pp->pl1[1][0],pp->pl1[1][1]);
m_memDC. LineTo(pp->pl1[13][0],pp->pl1[13][1]);
m_memDC. MoveTo(pp->pl1[2][0],pp->pl1[2][1]);
m_memDC. LineTo(pp->pl1[14][0],pp->pl1[14][1]);
m_memDC. MoveTo(pp->pl1[3][0],pp->pl1[3][1]);
m_memDC. LineTo(pp->pl1[15][0],pp->pl1[15][1]);
m_memDC. MoveTo(pp->pl2[0][0],pp->pl2[0][1]);
m_memDC. LineTo(pp->pl2[3][0],pp->pl2[3][1]);
m_memDC. MoveTo(pp->pl2[4][0],pp->pl2[4][1]);
m_memDC. LineTo(pp->pl2[7][0],pp->pl2[7][1]);
m_memDC. MoveTo(pp->pl2[8][0],pp->pl2[8][1]);
m_memDC. LineTo(pp->pl2[11][0],pp->pl2[11][1]);
m_memDC. MoveTo(pp->pl2[12][0],pp->pl2[12][1]);
m_memDC. LineTo(pp->pl2[15][0],pp->pl2[15][1]);
m_memDC. MoveTo(pp->pl2[0][0],pp->pl2[0][1]);
m_memDC. LineTo(pp->pl2[12][0],pp->pl2[12][1]);
m_memDC. MoveTo(pp->pl2[1][0],pp->pl2[1][1]);
m_memDC. LineTo(pp->pl2[13][0],pp->pl2[13][1]);
m_memDC. MoveTo(pp->pl2[2][0],pp->pl2[2][1]);
m_memDC. LineTo(pp->pl2[14][0],pp->pl2[14][1]);
m_memDC. MoveTo(pp->pl2[3][0],pp->pl2[3][1]);
m_memDC. LineTo(pp->pl2[15][0],pp->pl2[15][1]);
m_memDC. MoveTo(pp->pl3[0][0],pp->pl3[0][1]);
m_memDC. LineTo(pp->pl3[3][0],pp->pl3[3][1]);
m_memDC. MoveTo(pp->pl3[4][0],pp->pl3[4][1]);
m_memDC. LineTo(pp->pl3[7][0],pp->pl3[7][1]);
m_memDC. MoveTo(pp->pl3[8][0],pp->pl3[8][1]);
m_memDC. LineTo(pp->pl3[11][0],pp->pl3[11][1]);
m_memDC. MoveTo(pp->pl3[12][0],pp->pl3[12][1]);
m_memDC. LineTo(pp->pl3[15][0],pp->pl3[15][1]);
m_memDC. MoveTo(pp->pl3[0][0],pp->pl3[0][1]);
m_memDC. LineTo(pp->pl3[12][0],pp->pl3[12][1]);
m_memDC. MoveTo(pp->pl3[1][0],pp->pl3[1][1]);
m_memDC. LineTo(pp->pl3[13][0],pp->pl3[13][1]);
m_memDC. MoveTo(pp->pl3[2][0],pp->pl3[2][1]);
m_memDC. LineTo(pp->pl3[14][0],pp->pl3[14][1]);
m_memDC. MoveTo(pp->pl3[3][0],pp->pl3[3][1]);
m_memDC. LineTo(pp->pl3[15][0],pp->pl3[15][1]);
m_memDC. SelectObject(old);
//---
CString s1;
char f[3];
old=m_memDC. SelectObject(&pgre);
for(int kp=0;kp<16;kp++)
{ itoa(kp+1,f,10);
s1=f;
m_memDC. TextOut(pp->pl1[kp][0]-20,pp->pl1[kp][1]-20,s1);
}
for(int kp1=0;kp1<16;kp1++,kp++)
{ itoa(kp+1,f,10);
s1=f;
m_memDC. TextOut(pp->pl2[kp1][0]-20,pp->pl2[kp1][1]-20,s1);
}
for(int kp2=0;kp2<16;kp2++,kp++)
{ itoa(kp+1,f,10);
s1=f;
m_memDC. TextOut(pp->pl3[kp2][0]-20,pp->pl3[kp2][1]-20,s1);
}
m_memDC. SelectObject(old);
//
int d=0;
for(;d<16;d++)
{
m_memDC. MoveTo(pp->pl1[d][0],pp->pl1[d][1]);
m_memDC. LineTo(pp->pl1[d][0]-5,pp->pl1[d][1]+15);
m_memDC. LineTo(pp->pl1[d][0]+(pp->dxpl)*2-5,pp->pl1[d][1]+15);
m_memDC. LineTo(pp->pl1[d][0]+(pp->dxpl)*2,pp->pl1[d][1]);
}
for(d=0;d<4;d++)
{m_memDC. MoveTo(pp->pl1[d][0],pp->pl1[d][1]);
m_memDC. LineTo(pp->pl1[d][0]-30,pp->pl1[d][1]-5);
m_memDC. LineTo(pp->pl1[d][0]-30,pp->pl1[d][1]-(pp->dy)*15+5);
m_memDC. LineTo(pp->pl1[d][0],pp->pl1[d][1]-(pp->dy)*15);
m_memDC. MoveTo(pp->pl2[d][0],pp->pl2[d][1]);
m_memDC. LineTo(pp->pl2[d][0]-30,pp->pl2[d][1]-5);
m_memDC. LineTo(pp->pl2[d][0]-30,pp->pl2[d][1]-(pp->dy)*15+5);
m_memDC. LineTo(pp->pl2[d][0],pp->pl2[d][1]-(pp->dy)*15);
m_memDC. MoveTo(pp->pl3[d][0],pp->pl3[d][1]);
m_memDC. LineTo(pp->pl3[d][0]-30,pp->pl3[d][1]-5);
m_memDC. LineTo(pp->pl3[d][0]-30,pp->pl3[d][1]-(pp->dy)*15+5);
m_memDC. LineTo(pp->pl3[d][0],pp->pl3[d][1]-(pp->dy)*15);
}
for(d=0;d<16;d+=4)
{
m_memDC. MoveTo(pp->pl1[d][0],pp->pl1[d][1]);
m_memDC. LineTo(pp->pl1[d][0]-10,pp->pl1[d][1]-10);
m_memDC. LineTo(pp->pl1[d][0]-10+(pp->dx)*3,pp->pl1[d][1]-10-(pp->dy)*3);
m_memDC. LineTo(pp->pl1[d][0]+(pp->dx)*3,pp->pl1[d][1]-(pp->dy)*3);
m_memDC. MoveTo(pp->pl2[d][0],pp->pl2[d][1]);
m_memDC. LineTo(pp->pl2[d][0]-10,pp->pl2[d][1]-10);
m_memDC. LineTo(pp->pl2[d][0]-10+(pp->dx)*3,pp->pl2[d][1]-10-(pp->dy)*3);
m_memDC. LineTo(pp->pl2[d][0]+(pp->dx)*3,pp->pl2[d][1]-(pp->dy)*3);
m_memDC. MoveTo(pp->pl3[d][0],pp->pl3[d][1]);
m_memDC. LineTo(pp->pl3[d][0]-10,pp->pl3[d][1]-10);
m_memDC. LineTo(pp->pl3[d][0]-10+(pp->dx)*3,pp->pl3[d][1]-10-(pp->dy)*3);
m_memDC. LineTo(pp->pl3[d][0]+(pp->dx)*3,pp->pl3[d][1]-(pp->dy)*3);
}
//
if(pp->pcpumf[0]==NULL)
{pDC->BitBlt(0,0,maxX, maxY,&m_memDC,0,0,SRCCOPY);return;}
int kolz=0,sumtr=0;
COLORREF cl=0x000000ff;
COLORREF cl1=0x;
CPen pDR, pDR1;
pDR1.CreatePen(PS_SOLID,5,cl1);//RGB(green?,blue?,red!));
pDR. CreatePen(PS_SOLID,4,cl);//RGB(green?,blue?,red!));
r-=3;
for(kp=0;kp<16;kp++)
{ if(pp->pcpumf[kp]->bitrab==0)
{
CPen *old=m_memDC. SelectObject(&pDR);
m_memDC. Ellipse(pp->pl1[kp][0]-r, pp->pl1[kp][1]-r, pp->pl1[kp][0]+r, pp->pl1[kp][1]+r);
m_memDC. MoveTo(pp->pl1[kp][0]-r-3,pp->pl1[kp][1]-r-3);
m_memDC. LineTo(pp->pl1[kp][0]+r+3,pp->pl1[kp][1]+r+3);
m_memDC. MoveTo(pp->pl1[kp][0]-r-3,pp->pl1[kp][1]+r+3);
m_memDC. LineTo(pp->pl1[kp][0]+r+3,pp->pl1[kp][1]-r-3);
m_memDC. SelectObject(old);
continue;
}
for(kolz=pp->pcpumf[kp]->kolzad;kolz>0;kolz--)
sumtr+=pp->pcpumf[kp]->ppispcpu[kolz-1];
itoa(sumtr, f,10);
s1=f;s1+=" %";
m_memDC. TextOut(pp->pl1[kp][0]+5,pp->pl1[kp][1]+5,s1);
if(sumtr==100)
{ CPen *old=m_memDC. SelectObject(&pDR1);
m_memDC. Ellipse(pp->pl1[kp][0]-r, pp->pl1[kp][1]-r, pp->pl1[kp][0]+r, pp->pl1[kp][1]+r);
m_memDC. SelectObject(old);
}
sumtr=0;
}
for(kp=0,kp1=16;kp<16;kp++,kp1++)
{ if(pp->pcpumf[kp1]->bitrab==0)
{
CPen *old=m_memDC. SelectObject(&pDR);
m_memDC. Ellipse(pp->pl2[kp][0]-r, pp->pl2[kp][1]-r, pp->pl2[kp][0]+r, pp->pl2[kp][1]+r);
m_memDC. MoveTo(pp->pl2[kp][0]-r-3,pp->pl2[kp][1]-r-3);
m_memDC. LineTo(pp->pl2[kp][0]+r+3,pp->pl2[kp][1]+r+3);
m_memDC. MoveTo(pp->pl2[kp][0]-r-3,pp->pl2[kp][1]+r+3);
m_memDC. LineTo(pp->pl2[kp][0]+r+3,pp->pl2[kp][1]-r-3);
m_memDC. SelectObject(old);
continue;
}
for(kolz=pp->pcpumf[kp1]->kolzad;kolz>0;kolz--)
sumtr+=pp->pcpumf[kp1]->ppispcpu[kolz-1];
itoa(sumtr, f,10);
s1=f;s1+=" %";
m_memDC. TextOut(pp->pl2[kp][0]+5,pp->pl2[kp][1]+5,s1);
if(sumtr==100)
{ CPen *old=m_memDC. SelectObject(&pDR1);
m_memDC. Ellipse(pp->pl2[kp][0]-r, pp->pl2[kp][1]-r, pp->pl2[kp][0]+r, pp->pl2[kp][1]+r);
m_memDC. SelectObject(old);
}
sumtr=0;
}
for(kp=0,kp1=32;kp<16;kp++,kp1++)
{ if(pp->pcpumf[kp1]->bitrab==0)
{ CPen *old=m_memDC. SelectObject(&pDR);
m_memDC. Ellipse(pp->pl3[kp][0]-r, pp->pl3[kp][1]-r, pp->pl3[kp][0]+r, pp->pl3[kp][1]+r);
m_memDC. MoveTo(pp->pl3[kp][0]-r-3,pp->pl3[kp][1]-r-3);
m_memDC. LineTo(pp->pl3[kp][0]+r+3,pp->pl3[kp][1]+r+3);
m_memDC. MoveTo(pp->pl3[kp][0]-r-3,pp->pl3[kp][1]+r+3);
m_memDC. LineTo(pp->pl3[kp][0]+r+3,pp->pl3[kp][1]-r-3);
m_memDC. SelectObject(old);
continue;
}
for(kolz=pp->pcpumf[kp1]->kolzad;kolz>0;kolz--)
sumtr+=pp->pcpumf[kp1]->ppispcpu[kolz-1];
itoa(sumtr, f,10);
s1=f;s1+=" %";
m_memDC. TextOut(pp->pl3[kp][0]+5,pp->pl3[kp][1]+5,s1);
if(sumtr==100)
{ CPen *old=m_memDC. SelectObject(&pDR1);
m_memDC. Ellipse(pp->pl3[kp][0]-r, pp->pl3[kp][1]-r, pp->pl3[kp][0]+r, pp->pl3[kp][1]+r);
m_memDC. SelectObject(old);
}
sumtr=0;
}
//pDC->Ellipse(20,20,40,40);
pDC->BitBlt(0,0,maxX, maxY,&m_memDC,0,0,SRCCOPY);
WhiteBckgn();
}
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
void CVkss1View::AssertValid() const
{
CView::AssertValid();
}
void CVkss1View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CVkss1Doc* CVkss1View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CVkss1Doc)));
return (CVkss1Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CVkss1View message handlers
void CVkss1View::OnParametrs()
{//CMainFrame *pp=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
CVkss1Dlg VDlg11;
VDlg11.DoModal();
Invalidate(NULL);
}
void CVkss1View::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
OnDraw(&dc);
}
void CVkss1View::WhiteBckgn()
{ m_bkbrush. CreateStockObject(WHITE_BRUSH);
m_memDC. SelectObject(&m_bkbrush);
m_memDC. PatBlt(0,0,maxX, maxY, PATCOPY);
m_bkbrush. CreateStockObject(NULL_BRUSH);
m_memDC. SelectObject(&m_bkbrush);
m_memDC. PatBlt(0,0,maxX, maxY, PATCOPY);
}
void CVkss1View::virtwin()
{ if(one==1)return;
one=1;
maxX=GetSystemMetrics(SM_CXSCREEN);
maxY=GetSystemMetrics(SM_CYSCREEN);
CClientDC DC(this);
m_memDC. CreateCompatibleDC(&DC);
m_bmp. CreateCompatibleBitmap(&DC, maxX, maxY);
m_memDC. SelectObject(&m_bmp);
WhiteBckgn();
}
// MainFrm. h : interface of the CMainFrame class
//
/////////////////////////////////////////////////////////////////////////////
#include "cpu. h"
#include "Vkss1Dlg. h"
#if !defined(AFX_MAINFRM_H__3218DAF5_12E8_11D5_B96C_C712830F7F94__INCLUDED_)
#define AFX_MAINFRM_H__3218DAF5_12E8_11D5_B96C_C712830F7F94__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMainFrame : public CFrameWnd
{
protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// Attributes
public:
CVkss1Dlg *VDlg1;
int pl1[16][4];
int pl2[16][4];
int pl3[16][4];
int x, y,dx, dy, dxpl;
// int pn[48];
cpu *pcpumf[48];
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// MainFrm. cpp : implementation of the CMainFrame class
//
#include "stdafx. h"
#include "vkss1.h"
#include "MainFrm. h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{for(int i=0;i<48;i++){pcpumf[i]=NULL;}
//VDlg1=NULL;
for(int k=0;k<16;k++)
{pl1[k][0]=pl1[k][1]=pl1[k][2]=pl1[k][3]=0;
pl2[k][0]=pl2[k][1]=pl2[k][2]=pl2[k][3]=0;
pl3[k][0]=pl3[k][1]=pl3[k][2]=pl3[k][3]=0;
}
x=60;y=420;dx=48;dy=22;dxpl=250;
pl3[0][0]=dxpl+(pl2[0][0]=dxpl+(pl1[0][0]=x));
pl3[0][1]=pl2[0][1]=pl1[0][1]=y;
pl3[1][0]=dxpl+(pl2[1][0]=dxpl+(pl1[1][0]=x+dx));
pl3[1][1]=pl2[1][1]=pl1[1][1]=y-dy;
pl3[2][0]=dxpl+(pl2[2][0]=dxpl+(pl1[2][0]=x+2*dx));
pl3[2][1]=pl2[2][1]=pl1[2][1]=y-2*dy;
pl3[3][0]=dxpl+(pl2[3][0]=dxpl+(pl1[3][0]=x+3*dx));
pl3[3][1]=pl2[3][1]=pl1[3][1]=y-3*dy;
pl3[4][0]=dxpl+(pl2[4][0]=dxpl+(pl1[4][0]=x));
pl3[4][1]=pl2[4][1]=pl1[4][1]=y-5*dy;
pl3[5][0]=dxpl+(pl2[5][0]=dxpl+(pl1[5][0]=x+dx));
pl3[5][1]=pl2[5][1]=pl1[5][1]=y-6*dy;
pl3[6][0]=dxpl+(pl2[6][0]=dxpl+(pl1[6][0]=x+2*dx));
pl3[6][1]=pl2[6][1]=pl1[6][1]=y-7*dy;
pl3[7][0]=dxpl+(pl2[7][0]=dxpl+(pl1[7][0]=x+3*dx));
pl3[7][1]=pl2[7][1]=pl1[7][1]=y-8*dy;
pl3[8][0]=dxpl+(pl2[8][0]=dxpl+(pl1[8][0]=x));
pl3[8][1]=pl2[8][1]=pl1[8][1]=y-10*dy;
pl3[9][0]=dxpl+(pl2[9][0]=dxpl+(pl1[9][0]=x+dx));
pl3[9][1]=pl2[9][1]=pl1[9][1]=y-11*dy;
pl3[10][0]=dxpl+(pl2[10][0]=dxpl+(pl1[10][0]=x+2*dx));
pl3[10][1]=pl2[10][1]=pl1[10][1]=y-12*dy;
pl3[11][0]=dxpl+(pl2[11][0]=dxpl+(pl1[11][0]=x+3*dx));
pl3[11][1]=pl2[11][1]=pl1[11][1]=y-13*dy;
pl3[12][0]=dxpl+(pl2[12][0]=dxpl+(pl1[12][0]=x));
pl3[12][1]=pl2[12][1]=pl1[12][1]=y-15*dy;
pl3[13][0]=dxpl+(pl2[13][0]=dxpl+(pl1[13][0]=x+dx));
pl3[13][1]=pl2[13][1]=pl1[13][1]=y-16*dy;
pl3[14][0]=dxpl+(pl2[14][0]=dxpl+(pl1[14][0]=x+2*dx));
pl3[14][1]=pl2[14][1]=pl1[14][1]=y-17*dy;
pl3[15][0]=dxpl+(pl2[15][0]=dxpl+(pl1[15][0]=x+3*dx));
pl3[15][1]=pl2[15][1]=pl1[15][1]=y-18*dy;
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndStatusBar. Create(this) ||
!m_wndStatusBar. SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}





