Інститут менеджменту та економіки “Галицька Академія”
“Паралельні та розподілені обчислення”
Лабораторна робота №
Тема роботи: Створення простих багатопотокових (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;
}
}
Висновок: На даній лабораторній роботі ми пробували розділити цикли на декілька частин, тим самим ми організували ніби то паралельне обчислення цих циклів , хоча насправді вони виконувались послідовно.