У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


Інститут менеджменту та економіки “Галицька Академія”

“Паралельні та розподілені обчислення”

Лабораторна робота №

Тема роботи: Створення простих багатопотокових (multithreads) програм.

Мета роботи:. Освоєння принципів створення, організації та управління простих багатопотокових додатків за допомогою класу TThread в середовищі візуального програмування C++Builder.

Завдання для виконання роботи

Розробити програму розрахунку функції відповідно до завдання з табл. .1. Для розрахунку кожного блоку функції організувати окремий потік за допомогою базового класу TThread. Дати назву класам, що реалізовують потоки по прізвищу (наприклад, IvanovP1, IvanovP2).

Забезпечити:

можливість запуску потоків в послідовному і паралельному варіантах;

можливість установки відносних пріоритетів потоків;

можливість припинення, продовження виконання потоків;

можливість завершення потоків;

відображення ходу виконання кожного потоку за допомогою ProgressBar або самостійно реалізованого індикатора процесу виконання;

відображення схеми виконання потоків;

відображення дескрипторів потоків;

відображення результату розрахунку.

2 | cos(i) | sin(i) | i-sin(i) | cos2(i) | cos2(i)+ 1/i

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Main.h"

#include "p1.h"

#include "p2.h"

#include "p3.h"

#include "p4.h"

#include "p5.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int P1r,P2r,P3r,P4r,P5r;

//------------1---------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

TrackBar1->Min=0;

TrackBar1->Max=6;

TrackBar1->Position=3;

TrackBar2->Min=0;

TrackBar2->Max=6;

TrackBar2->Position=3;

TrackBar3->Min=0;

TrackBar3->Max=6;

TrackBar3->Position=3;

TrackBar4->Min=0;

TrackBar4->Max=6;

TrackBar4->Position=3;

TrackBar5->Min=0;

TrackBar5->Max=6;

TrackBar5->Position=3;

ProgressBar1->Max=10000;

ProgressBar2->Max=10000;

ProgressBar3->Max=10000;

ProgressBar4->Max=10000;

ProgressBar5->Max=10000;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

P1 *p1 = new P1(true);

P2 *p2 = new P2(true);

P3 *p3 = new P3(true);

P4 *p4 = new P4(true);

P5 *p5 = new P5(true);

Form1->ProgressBar1->Position =0;

Form1->ProgressBar2->Position =0;

Form1->ProgressBar3->Position =0;

Form1->ProgressBar4->Position =0;

Form1->ProgressBar5->Position =0;

Form1->Label3->Caption= IntToStr(p1->Handle);

Form1->Label6->Caption= IntToStr(p2->Handle);

Form1->Label9->Caption= IntToStr(p3->Handle);

Form1->Label12->Caption= IntToStr(p4->Handle);

Form1->Label15->Caption= IntToStr(p5->Handle);

switch(P1r)

{

case 0:p1->Priority=tpIdle;break;

case 1:p1->Priority=tpLowest;break;

case 2:p1->Priority=tpLower;break;

case 3:p1->Priority=tpNormal;break;

case 4:p1->Priority=tpHigher;break;

case 5:p1->Priority=tpHighest;break;

case 6:p1->Priority=tpTimeCritical;break;

}

switch(P2r)

{

case 0:p2->Priority=tpIdle;break;

case 1:p2->Priority=tpLowest;break;

case 2:p2->Priority=tpLower;break;

case 3:p2->Priority=tpNormal;break;

case 4:p2->Priority=tpHigher;break;

case 5:p2->Priority=tpHighest;break;

case 6:p2->Priority=tpTimeCritical;break;

}

switch(P3r)

{

case 0:p3->Priority=tpIdle;break;

case 1:p3->Priority=tpLowest;break;

case 2:p3->Priority=tpLower;break;

case 3:p3->Priority=tpNormal;break;

case 4:p3->Priority=tpHigher;break;

case 5:p3->Priority=tpHighest;break;

case 6:p3->Priority=tpTimeCritical;break;

}

switch(P4r)

{

case 0:p4->Priority=tpIdle;break;

case 1:p4->Priority=tpLowest;break;

case 2:p4->Priority=tpLower;break;

case 3:p4->Priority=tpNormal;break;

case 4:p4->Priority=tpHigher;break;

case 5:p4->Priority=tpHighest;break;

case 6:p4->Priority=tpTimeCritical;break;

}

switch(P5r)

{

case 0:p5->Priority=tpIdle;break;

case 1:p5->Priority=tpLowest;break;

case 2:p5->Priority=tpLower;break;

case 3:p5->Priority=tpNormal;break;

case 4:p5->Priority=tpHigher;break;

case 5:p5->Priority=tpHighest;break;

case 6:p5->Priority=tpTimeCritical;break;

}

if(RadioButton1->Checked)

{

p1->Resume();

p2->Resume();

p1->WaitFor();

p2->WaitFor();

p3->Resume();

p4->Resume();

p3->WaitFor();

p4->WaitFor();

p5->Resume();

}else

if(RadioButton2->Checked)

{

p1->Resume();

p1->WaitFor();

p2->Resume();

p2->WaitFor();

p3->Resume();

p3->WaitFor();

p4->Resume();

p4->WaitFor();

p5->Resume();

}

Form1->Label18->Caption= FloatToStr(p1->s1+p2->s2+p3->s3+p4->s4+p5->s5);

p1->Free();

p2->Free();

p3->Free();

p4->Free();

p5->Free();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::TrackBar1Change(TObject *Sender)

{

P1r=Form1->TrackBar1->Position;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::TrackBar2Change(TObject *Sender)

{

P2r=Form1->TrackBar2->Position;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::TrackBar3Change(TObject *Sender)

{

P3r=Form1->TrackBar3->Position;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::TrackBar4Change(TObject *Sender)

{

P4r=Form1->TrackBar4->Position;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::TrackBar5Change(TObject *Sender)

{

P5r=Form1->TrackBar5->Position;

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall P1::Execute()

{

for(int i=0;i<10000;i++)

{

s1+=cos(i);

Form1->ProgressBar1->Position = i;

}

}

void __fastcall P2::Execute()

{

Form1->ProgressBar2->Position =0;

for(int i=0;i<10000;i++)

{

s2+=sin(i);

Form1->ProgressBar2->Position = i;

}

}

void __fastcall P3::Execute()

{

Form1->ProgressBar3->Position =0;

for(int i=0;i<10000;i++)

{

s3+=i-sin(i);

Form1->ProgressBar3->Position = i;

}

}

void __fastcall P4::Execute()

{

Form1->ProgressBar4->Position =0;

for(int i=0;i<10000;i++)

{

s4+=(cos(i)*cos(i)+1/(i+1));

Form1->ProgressBar4->Position = i;

}

}

//---------------------------------------------------------------------------

void __fastcall P5::Execute()

{

Form1->ProgressBar5->Position =0;

for(int i=0;i<10000;i++)

{

s5+=(cos(i)*cos(i));

Form1->ProgressBar5->Position = i;

}

}

Висновок: На даній лабораторній роботі ми пробували розділити цикли на декілька частин, тим самим ми організували ніби то паралельне обчислення цих циклів , хоча насправді вони виконувались послідовно.