ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Бинхронизация ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². 
ИспользованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² прилоТСниях Windows

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° автоматичСски Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Execute () ΠΈΠ»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ прилоТСния. Π§Ρ‚ΠΎΠ±Ρ‹ занятая ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ освобоТдалась ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π°Π΄ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ FreeOnTerminate=false. FMain→reThread2→Lines→Add (IntToStr (count) + «) «+ «max = «+ max + «, min = «+ min); //Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² вычислСния. Synchronize (&Sinchr); //Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Бинхронизация ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ИспользованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² прилоТСниях Windows (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² основываСтся Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ событий (event). ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° событиС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… состояний: Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΈΠ»ΠΈ пассивноС. Когда событиС находится Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ состоянии, Π΅Π³ΠΎ видят ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для управлСния Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ сразу ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ VCL события прСдставлСны классом TEvent.

ΠœΠ΅Ρ‚ΠΎΠ΄ CreatEvents (): Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса TEvent, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ события.

ΠœΠ΅Ρ‚ΠΎΠ΄ ResetEvent (): ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ события Π² ΠΏΠ°ΡΡΠΈΠ²Π½ΠΎΠ΅ состояниС.

ΠœΠ΅Ρ‚ΠΎΠ΄ SetEvent (): ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ события Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ состояниС.

WaitForSingleObject (): ЗаставляСт ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ процСсс Π½Π΅ ΠΏΠΎΡˆΠ»ΡŽΡ‚ сигнал ΠΎΠ± Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° событиС.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Ρ‹ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Ρ€Π°Π· Π² ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ остановки Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° suspend. Для продолТСния выполнСния приостановлСнного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΡ‚ΠΎΠΊΠ° Resume. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚. ΠΊ. ΠΌΠ΅Ρ‚ΠΎΠ΄ Suspend ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ счСтчик ΠΏΠΎΡ‚ΠΎΠΊΠ°, a Resume ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚. ΠŸΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° счСтчик Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² Π½ΠΎΠ»ΡŒ, Ρ‚. Π΅., Ссли Π²Ρ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ ΠΏΡΡ‚ΡŒ Ρ€Π°Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ Suspend, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π° Resume, Π²Π°ΠΌ понадобится Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ (пятый) Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Resume для продолТСния выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° автоматичСски Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Execute () ΠΈΠ»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ прилоТСния.

Π§Ρ‚ΠΎΠ±Ρ‹ занятая ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ освобоТдалась ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π°Π΄ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ FreeOnTerminate=false.

4. Листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π€Π°ΠΉΠ» UMain.cpp.

#include.

#pragma hdrstop.

#include «UMain.h» .

#include «UThread1.h» .

#include «UThread2.h» .

#include «UThread3.h» .

//—————————————————————————————————————;

#pragma package (smart_init).

#pragma resource «*.dfm» .

TFMain *FMain;

ThreadCreatMassiv *thread1;

ThreadMinMax *thread2;

ThreadIndex *thread3;

//—————————————————————————————————————;

__fastcall TFMain: TFMain (TComponent* Owner).

: TForm (Owner).

{.

}.

//—————————————————————————————————————;

void __fastcall TFMain: btnStartClick (TObject *Sender).

{.

if (eN->Text == «» || eT->Text == «») {.

StatusBar1->Panels->Items[0]->Text="Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ всС поля" ;

}else{.

StatusBar1->Panels->Items[0]->Text="" ;

reThread1->Clear ();

reThread2->Clear ();

reThread3->Clear ();

g_Event[0] = CreateEvent (NULL, FALSE, FALSE, NULL); //Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ событиС.

g_Event[1] = CreateEvent (NULL, FALSE, TRUE, NULL); //Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ событиС.

SetEvent (g_Event[0]); //Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

ResetEvent (g_Event[1]); //Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

thread1 = new ThreadCreatMassiv (true); //создаСм ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ состоянии (true).

thread1->N = StrToInt (eN->Text); //ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΡƒ.

thread1->T = StrToInt (eT->Text);

thread1->Resume (); //ВозобновляСт Ρ€Π°Π±ΠΎΡ‚Ρƒ приостановлСнного ΠΏΠΎΡ‚ΠΎΠΊΠ°.

thread2 = new ThreadMinMax (true);

thread2->N = StrToInt (eN->Text);

thread2->T = StrToInt (eT->Text);

thread2->Resume ();

thread3 = new ThreadIndex (true);

thread3->N = StrToInt (eN->Text);

thread3->T = StrToInt (eT->Text);

thread3->Resume ();

}.

}.

//—————————————————————————————————————;

void __fastcall TFMain: btnStopClick (TObject *Sender).

{.

thread1->Suspend (); //ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

thread2->Suspend ();

thread3->Suspend ();

}.

//—————————————————————————————————————;

void __fastcall TFMain: btnExitClick (TObject *Sender).

{.

FMain->Close ();

}.

//—————————————————————————————————————;

Π€Π°ΠΉΠ» UThread1.cpp.

#include.

#pragma hdrstop.

#include «UThread1.h» .

#include «UMain.h» .

#include «UThread2.h» .

#pragma package (smart_init).

//—————————————————————————————————————;

// Important: Methods and properties of objects in VCL can only be.

// used in a method called using Synchronize, for example:

// Synchronize (&UpdateCaption);

// where UpdateCaption could look like:

// void __fastcall ThreadCreatMassiv: UpdateCaption ().

// {.

// Form1->Caption = «Updated in a thread» ;

// }.

//—————————————————————————————————————;

__fastcall ThreadCreatMassiv: ThreadCreatMassiv (bool CreateSuspended).

: TThread (CreateSuspended).

{.

}.

//—————————————————————————————————————;

void __fastcall ThreadCreatMassiv: Execute ().

{.

int min = -999;

int max = 999;

FreeOnTerminate = true; // ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π°Π½ΡΡ‚ΡƒΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

while (true) {.

WaitForSingleObject (FMain->g_Event[0], INFINITE);

ResetEvent (FMain->g_Event[1]); //Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ массива.

ResetEvent (FMain->g_Event[0]); //Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ массива.

srand (time (NULL));

for (int i = 0; i < N; i++) {.

FMain->A[i] = rand () % (min max) + min; //заполняСм массив Ρ€Π°Π½Π΄ΠΎΠΌΠ½Ρ‹ΠΌΠΈ числами.

}.

count++;

if (Terminated) break; // ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ·Π²Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊ.

Synchronize (&Sinchr); //Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Sleep (T*1000);

}.

//—————————————————————————————————————;

}.

void __fastcall ThreadCreatMassiv: Sinchr ().

{.

AnsiString rezult;

for (int i = 0; i < N; i++) {.

rezult += IntToStr (FMain->A[i]) + «, «;

SetEvent (FMain->g_Event[0]); //Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

SetEvent (FMain->g_Event[1]); //Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

}.

FMain->reThread1->Lines->Add (IntToStr (count) + «) «+ rezult); //Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² вычислСния Π€Π°ΠΉΠ» Thread2.cpp.

#include.

#pragma hdrstop.

#include «UThread2.h» .

#include «UMain.h» .

#include «UThread1.h» .

#pragma package (smart_init).

//—————————————————————————————————————;

// Important: Methods and properties of objects in VCL can only be.

// used in a method called using Synchronize, for example:

// Synchronize (&UpdateCaption);

// where UpdateCaption could look like:

// void __fastcall ThreadSredZnach: UpdateCaption ().

// {.

// Form1->Caption = «Updated in a thread» ;

// }.

//—————————————————————————————————————;

__fastcall ThreadMinMax: ThreadMinMax (bool CreateSuspended).

: TThread (CreateSuspended).

{.

}.

//—————————————————————————————————————;

void __fastcall ThreadMinMax: Execute ().

{.

FreeOnTerminate = true; // ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π°Π½ΡΡ‚ΡƒΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

while (true){.

WaitForSingleObject (FMain->g_Event[1], INFINITE); //ΠΆΠ΄Ρ‘ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

ResetEvent (FMain->g_Event[1]); //Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ массива.

ResetEvent (FMain->g_Event[0]); //Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ массива.

max = 0;

min = 0;

max = FMain->A[0];

for (int i = 0; i.

if (FMain->A[i] < min).

{.

min = FMain->A[i];

}.

if (FMain->A[i] > max).

{.

max = FMain->A[i];

}.

}.

count++;

if (Terminated) break; // ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ·Π²Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊ.

Synchronize (&Sinhr); //Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Sleep (T*1000);

}.

}.

//—————————————————————————————————————;

void __fastcall ThreadMinMax: Sinhr ().

{.

FMain->reThread2->Lines->Add (IntToStr (count) + «) «+ «max = «+ max + «, min = «+ min); //Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² вычислСния.

SetEvent (FMain->g_Event[0]); //Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

SetEvent (FMain->g_Event[1]); //Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

}.

Π€Π°ΠΉΠ» UThread3.cpp.

#include.

#pragma hdrstop.

#include «UThread3.h» .

#include «UMain.h» .

#include «UThread1.h» .

#include «UThread2.h» .

#pragma package (smart_init).

//—————————————————————————————————————;

// Important: Methods and properties of objects in VCL can only be.

// used in a method called using Synchronize, for example:

// Synchronize (&UpdateCaption);

// where UpdateCaption could look like:

// void __fastcall ThreadIndex: UpdateCaption ().

// {.

// Form1->Caption = «Updated in a thread» ;

// }.

//—————————————————————————————————————;

__fastcall ThreadIndex: ThreadIndex (bool CreateSuspended).

: TThread (CreateSuspended).

{.

}.

//—————————————————————————————————————;

void __fastcall ThreadIndex: Execute ().

{.

FreeOnTerminate = true; // ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π°Π½ΡΡ‚ΡƒΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

int tN = N/3;

while (true){.

WaitForSingleObject (FMain->g_Event[1], INFINITE); //ΠΆΠ΄Ρ‘ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

ResetEvent (FMain->g_Event[1]); //Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ массива.

ResetEvent (FMain->g_Event[0]); //Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ массива.

rezult = «» ;

for (int i = 0; i < N; i++){.

sum += FMain->A[i]; //сумма всСх элСмСнтов массива.

}.

arg = sum/N; // срСднСС арифмитичСскоС.

for (int i = 0; i < N; i++){.

raz = arg FMain->A[i]; // ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ числа.

rezult += FloatToStr (raz) + «, «;

}.

count++;

if (Terminated) break; // ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ·Π²Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊ.

Synchronize (&Sinhr); //Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Sleep (T*1000);

}.

}.

//—————————————————————————————————————;

void __fastcall ThreadIndex: Sinhr (){.

FMain->reThread3->Lines->Add (IntToStr (count) + «) «+ rezult); //Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² вычислСния.

SetEvent (FMain->g_Event[0]); //Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

SetEvent (FMain->g_Event[1]); //Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

}.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ