Министерство высшего и профессиональной образования РФ

НГТУ

Кафедра ВТ

Курсовая работа по дисциплине

«Вычислительные комплексы системы и сети»

Факультет: АВТ

Группа: АМ-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);

}